在模板派生类中使用类型别名继承构造函数

Jun*_*eon 4 c++ language-lawyer c++11 inheriting-constructors

请参见以下代码:

struct base {};

template <class T>
struct derived : T {
  using base_type = T;
  using base_type::T;
};

int main()
{
  derived<base> x;
}
Run Code Online (Sandbox Code Playgroud)

GCC接受此代码,但是Clang和MSVC拒绝它。谁是正确的,为什么?

Nic*_*one 5

using base_type::T;声明using之前是别名。在标准中这是一个边缘情况,因为真正的问题归结为T扩展到哪里。此处引用C ++委员会表示,他们不打算使该语法有效,因此LLVM明确删除了该语法。看起来标准中没有阻止它的任何内容,因此gcc在允许转换方面并不是不正确的。谁是“正确的”取决于您。