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

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

在本例中:

1
2
3
4
5
template<class T>
struct S : T
{
    using T::X;
};

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

1
2
3
4
5
6
struct X
{
    X(int) {}
};
...
S<X> s(42);

using声明将成为继承构造函数吗?

clang拒绝代码demo,而g++接受它。

注意,如果我们写:

1
using T::X::X;

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


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

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

在这种情况下,clang发出的错误消息是有意义的,因为t::x是x类型,它会触发"从模板中键入不带typename标记的类型"错误。

原始职位:

所以在我看来,真正的问题是,"允许模板实例化更改using语句的语义吗?"

答案是,这不是不允许的。我不知道该标准的作者是否已经预见到了这种相互作用,并且打算这样做。但据我所见,参考第10节中的使用声明和第17节中的模板初始化,通过标准的字母"是",允许使用using T::X,是的,当t为x时,使用声明将成为继承构造函数。