Jam*_*ree 12 c++ templates using-declaration conversion-operator
考虑这个例子:
struct B { operator int(); };
template<class T>
struct X:B
{
using B::operator T;
};
Run Code Online (Sandbox Code Playgroud)
请注意,如果基类型是相关的,则所有编译器都接受以下代码:
template<class T>
struct B { operator T(); };
template<class T>
struct X:B<T>
{
using B<T>::operator T;
};
Run Code Online (Sandbox Code Playgroud)
我认为GCC是对的,在§7.3.3/1中,我们可以发现:
using 声明引入的声明集是通过对 using 声明中的名称执行限定名称查找(3.4.3、10.2)来找到的,不包括如下所述隐藏的函数。
实际上,我看不出有什么理由operator T
找不到:
template<class T>
struct X: B {
T f () { return B::operator T; }
};
Run Code Online (Sandbox Code Playgroud)
...使用 g++ 和 clang 可以正常编译(未在 MSVC 上测试)。
我在标准中找不到任何特定于限定名称查找的转换函数的内容,除了:
由于名称查找无法找到转换函数的成员模板的特化,因此当 using 声明指定转换函数时,不会考虑它们 (14.5.2)。
但B::operator int
不是成员函数模板的特化,因此上面不应考虑它。
归档时间: |
|
查看次数: |
203 次 |
最近记录: |