在模板派生类中继承具有类型别名的构造函数

Inheriting constructor with a type alias in a template derived class

本文关键字:类型 别名 构造函数 继承 派生      更新时间:2023-10-16

请参阅以下代码:

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允许转换并没有错。谁是"正确的"取决于你。