在using-declaration中,依赖名称可以在模板替换后呈现给构造函数吗?

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是指部件上的从属名称XT.如果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允许通过标准成为继承,构造函数?

Omn*_*ity 4

感谢 TC 指出这一点:

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

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

原帖:

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

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