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; }; |
1 2 3 4 5 6 | struct X { X(int) {} }; ... S<X> s(42); |
using声明将成为继承构造函数吗?
clang拒绝代码demo,而g++接受它。
注意,如果我们写:
1 | using T::X::X; |
两个编译器都接受代码并将其视为继承构造函数。是否允许
感谢T.C.指出这一点:
核心问题2070正在起草阶段(它被确认为一个问题,解决方案的措辞正在研究中),处理这个案件。建议的修复程序要求两个ID都是相同的ID,以便将此代码接受为继承构造函数。
在这种情况下,clang发出的错误消息是有意义的,因为t::x是x类型,它会触发"从模板中键入不带typename标记的类型"错误。
原始职位:
所以在我看来,真正的问题是,"允许模板实例化更改using语句的语义吗?"
答案是,这不是不允许的。我不知道该标准的作者是否已经预见到了这种相互作用,并且打算这样做。但据我所见,参考第10节中的使用声明和第17节中的模板初始化,通过标准的字母"是",允许使用