首页 > 解决方案 > 在模板派生类中使用类型别名继承构造函数

问题描述

请看以下代码:

struct base {};

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

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

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

标签: c++c++11language-lawyerinheriting-constructors

解决方案


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


推荐阅读