Jam*_*ree 18 c++ templates using-declaration language-lawyer inheriting-constructors
在这个例子中:
template<class T>
struct S : T
{
using T::X;
};
Run Code Online (Sandbox Code Playgroud)
T::X
是指部件上的从属名称X
在T
.如果S<T>
实例化为T = X
:
struct X
{
X(int) {}
};
...
S<X> s(42);
Run Code Online (Sandbox Code Playgroud)
using声明是否会成为继承构造函数?
Clang拒绝代码DEMO,而g ++接受它.
请注意,如果我们写:
using T::X::X;
Run Code Online (Sandbox Code Playgroud)
两个编译器都接受代码并将其视为继承构造函数.被using T::X
允许通过标准成为继承,构造函数?
感谢 TC 指出这一点:
正在起草阶段的核心issue 2070(已确认为问题,正在制定解决方案的措辞)就是处理这种情况。建议的修复是要求两个 ID 为相同的 ID,以便此代码被接受为继承构造函数。
从这个角度来看,来自 clang 的错误消息是有意义的,因为 T::X 将是类型 X,这会触发“来自模板的类型,没有 typename 标记”错误。
原帖:
所以在我看来,真正的问题是,“是否允许模板实例化改变 using 语句的语义?”
答案是,这并不被禁止。我不知道这种交互是否是标准作者预见和有意为之的。但据我所知,引用第 10 节中的 using 声明和第 17 节中的模板初始化,按照标准的字母,是的,using T::X
是允许的,是的,当 T 为 X 时,using 声明将成为继承构造函数。