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

In using-declaration, can dependent names render to constructors after template substitution?

在这个例子中:

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

T::X 是引用 T 中的成员 X 的从属名称。 如果 S<T> 实例化为 T = X:

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

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

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

注意如果我们写:

using T::X::X;

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

感谢T.C。指出这一点:

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

从这个角度来看,来自 clang 的错误消息是有道理的,因为 T::X 将是类型 X,它会触发 "type from template without typename tag" 错误。

原文Post:

所以在我看来,真正的问题是,"Is it allowable that a template instantiation changes the semantic meaning of a using statement?"

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