【发布时间】:2016-12-01 05:05:12
【问题描述】:
考虑这个例子:
struct B { operator int(); };
template<class T>
struct X:B
{
using B::operator T;
};
GCC 接受代码,而 Clang 和 MSVC 拒绝它。 哪个是正确的?
注意,如果基类型是依赖的,所有的编译器都接受代码:
template<class T>
struct B { operator T(); };
template<class T>
struct X:B<T>
{
using B<T>::operator T;
};
【问题讨论】:
-
如果您在
B中将operator int()设为模板化转换函数(例如template <typename T> operator T();),则它可以工作,如果您将其专门用于int,它也可以工作并调用专业化,而作为据我了解,标准禁止它(“由于名称查找未找到转换函数的成员模板的特化,因此在 using-declaration 指定转换函数时不考虑它们(14.5.2)。”)。另外,如果你在成员函数中调用,clang 可以找到operator T,所以我认为 gcc 是对的。
标签: c++ templates conversion-operator using-declaration