在这个例子中:
template<class T>
struct S : T
{
using T::X;
};
T::X
是一个从属名称,它引用 T
中的成员 X
. 如果使用 T = X
实例化 S<T>
:
struct X
{
X(int) {}
};
...
S<X> s(42);
using声明是否会成为继承构造函数?
Clang拒绝代码DEMO,而g接受它 .
请注意,如果我们写:
using T::X::X;
两个编译器都接受代码并将其视为继承构造函数 . 允许 using T::X
成为标准的继承构造函数吗?
1 回答
感谢T.C.指出这个:
Core issue 2070,处于起草阶段(确认是一个问题,解决方案的措辞正在制定中),处理此案例 . 建议的修复程序要求两个ID都是相同的ID,以便将此代码作为继承构造函数接受 .
在这种情况下,来自clang的错误消息是有意义的,因为T :: X将是类型X,它触发“从没有typename标签的模板类型”错误 .
原帖:
所以在我看来,真正的问题是,“模板实例化是否允许改变using语句的语义?”
答案是,它不被禁止 . 我不知道该标准的作者是否预见到了这种相互作用 . 但据我所知,引用第10节中的using声明和第17节中的模板初始化,通过标准的字母,是的,
using T::X
是允许的,是的,当T是T时,using声明将成为继承构造函数X .