类型别名是否用作函数签名的函数参数类型?
Are type aliases used as type of function parameter part of the function signature?
考虑一个例子:
#include <iostream>
#include <vector>
template <class, class T>
using alias = T;
template <template <class...> class>
struct tt_wrapper{};
template <class...>
struct t_wrapper{};
struct A {
template <template <class...> class TT, class T>
void foo(alias<tt_wrapper<TT>, T>) { std::cout << "A::foo invoked" << std::endl; }
};
struct B: A {
using A::foo;
template <class U, class T>
void foo(alias<t_wrapper<U>, T>) { std::cout << "B::foo invoked" << std::endl; }
};
int main() {
B b;
b.foo<std::vector>(int{});
}
When a using-declaration brings names from a base class into a derived
class scope, member functions and member function templates in the
derived class override and/or hide member functions and member
function templates with the same name, parameter-type-list,
cv-qualification, and ref-qualifier (if any) in a base class (rather
than conflicting).
所以显然模板参数不应该参与成员函数隐藏。然而,在我们的示例中,模板参数是使用别名带到签名中的。尽管如此,clang 似乎并不认为别名是函数 parameter-type-list 的一部分,并声称:
prog.cc:26:7: error: no matching member function for call to 'foo'
b.foo<std::vector>(int{});
~~^~~~~~~~~~~~~~~~
prog.cc:21:10: note: candidate template ignored: invalid explicitly-specified argument for template parameter 'U'
void foo(alias<t_wrapper<U>, T>) { std::cout << "B::foo invoked" << std::endl; }
^
1 error generated.
考虑到 gcc 在隐藏过程中涉及模板参数列表,我特意省略了。 clang对吗?
A::foo
和 B::foo
有
- 同名 (
foo
)
- 参数类型列表 (
T
!!!)
- cv-资格(非
const
,非易失性)
- ref-限定符 (None)
不考虑模板参数列表。
基 class 中的方法不是虚拟的,因此隐藏而不是覆盖。
Demo 参数类型列表是 T
.
考虑一个例子:
#include <iostream>
#include <vector>
template <class, class T>
using alias = T;
template <template <class...> class>
struct tt_wrapper{};
template <class...>
struct t_wrapper{};
struct A {
template <template <class...> class TT, class T>
void foo(alias<tt_wrapper<TT>, T>) { std::cout << "A::foo invoked" << std::endl; }
};
struct B: A {
using A::foo;
template <class U, class T>
void foo(alias<t_wrapper<U>, T>) { std::cout << "B::foo invoked" << std::endl; }
};
int main() {
B b;
b.foo<std::vector>(int{});
}
When a using-declaration brings names from a base class into a derived class scope, member functions and member function templates in the derived class override and/or hide member functions and member function templates with the same name, parameter-type-list, cv-qualification, and ref-qualifier (if any) in a base class (rather than conflicting).
所以显然模板参数不应该参与成员函数隐藏。然而,在我们的示例中,模板参数是使用别名带到签名中的。尽管如此,clang 似乎并不认为别名是函数 parameter-type-list 的一部分,并声称:
prog.cc:26:7: error: no matching member function for call to 'foo'
b.foo<std::vector>(int{});
~~^~~~~~~~~~~~~~~~
prog.cc:21:10: note: candidate template ignored: invalid explicitly-specified argument for template parameter 'U'
void foo(alias<t_wrapper<U>, T>) { std::cout << "B::foo invoked" << std::endl; }
^
1 error generated.
考虑到 gcc 在隐藏过程中涉及模板参数列表,我特意省略了。 clang对吗?
A::foo
和 B::foo
有
- 同名 (
foo
) - 参数类型列表 (
T
!!!) - cv-资格(非
const
,非易失性) - ref-限定符 (None)
不考虑模板参数列表。
基 class 中的方法不是虚拟的,因此隐藏而不是覆盖。
Demo 参数类型列表是 T
.