4

请看以下代码:

struct base {};

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

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

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

4

1 回答 1

5

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

于 2018-08-01T19:27:44.903 回答