请参见以下代码:
struct base {};
template <class T>
struct derived : T {
using base_type = T;
using base_type::T;
};
int main()
{
derived<base> x;
}
GCC接受此代码,但是Clang和MSVC拒绝它。谁是正确的,为什么?
答案 0 :(得分:4)
using base_type::T;
是declaration,之前的using
是alias。由于实际问题归结为T
扩展到的位置,因此这在标准中有点极端。引用here的C ++委员会表示,他们不希望该语法有效,因此LLVM明确删除了该语法。看起来标准中没有阻止它的任何内容,因此gcc在允许转换方面并不是不正确的。谁是“正确的”,取决于您。