请参阅以下代码:
struct base {};
template <class T>
struct derived : T {
using base_type = T;
using base_type::T;
};
int main()
{
derived<base> x;
}
GCC接受这个代码,但Clang和MSVC拒绝了。谁是对的,为什么?
using base_type::T;
是一个声明,它之前的using
是一个别名。这在标准中有点边缘化,因为真正的问题归结为T
在哪里扩展。这里引用的C++委员会说,他们不希望该语法有效,所以LLVM明确删除了它。看起来标准中没有任何东西阻止它,所以gcc允许转换并没有错。谁是"正确的"取决于你。