是`使用Base :: operator T`允许`T`是模板类型参数?

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)

GCC接受代码,而Clang和MSVC拒绝它.哪个是对的?

请注意,如果基类型是相关的,则所有编译器都接受以下代码:

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)

Hol*_*olt 3

我认为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不是成员函数模板的特化,因此上面不应考虑它。