18

在这个例子中:

template<class T>
struct S : T
{
    using T::X;
};

T::X是一个从属名称,指的是 中的成员XT如果S<T>用 实例化T = X

struct X
{
    X(int) {}
};
...
S<X> s(42);

使用声明会变成继承构造函数吗?

Clang 拒绝代码DEMO,而 g++ 接受它。

请注意,如果我们写:

using T::X::X;

两个编译器都接受代码并将其视为继承构造函数。是否using T::X允许按标准成为继承构造函数?

4

1 回答 1

4

感谢 TC 指出这一点:

处于起草阶段的核心问题 2070(已确认是一个问题,正在研究解决方案的措辞),处理此案例。建议的修复要求两个 ID 是相同的 ID,以便此代码被接受为继承构造函数。

从这个角度来看,来自 clang 的错误消息是有道理的,因为 T::X 将是 X 类型,这会触发“来自模板的类型没有 typename 标签”错误。

原帖:

所以在我看来,真正的问题是,“是否允许模板实例化改变 using 语句的语义含义?”

答案是,这是不允许的。我不知道标准的作者是否预见到并打算使用这种交互。但据我所见,引用第 10 节中的 using 声明和第 17 节中的模板初始化,按照标准的字母,是的,using T::X是允许的,是的,当 T 为 X 时,using 声明将成为继承构造函数.

于 2017-04-07T02:21:09.587 回答