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

时间:2018-08-01 19:00:23

标签: c++ c++11 language-lawyer inheriting-constructors

请参见以下代码:

struct base {};

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

int main()
{
  derived<base> x;
}

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

1 个答案:

答案 0 :(得分:4)

using base_type::T;declaration,之前的usingalias。由于实际问题归结为T扩展到的位置,因此这在标准中有点极端。引用here的C ++委员会表示,他们不希望该语法有效,因此LLVM明确删除了该语法。看起来标准中没有阻止它的任何内容,因此gcc在允许转换方面并不是不正确的。谁是“正确的”,取决于您。