18

在这个例子中:在使用声明中,依赖名称可以在模板替换后呈现给构造函数吗?

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

T::X是指构件XT一个从属名称。 如果S<T>进行实例化T = X

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

请问using声明成为继承,构造函数?

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

注意,如果我们写:

using T::X::X; 

两种编译器接受的代码,并把它当作继承构造函数。 是否允许using T::X通过标准成为继承构造函数?

回答

4

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

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

有鉴于此,来自clang的错误信息是有意义的,因为T :: X将是类型X,它会触发“没有typename标签的模板类型”错误。

原贴:

所以,在我看来,真正的问题是:“是许用一个模板实例改变using语句的语义?”

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

+4

请参阅[核心问题2070](https://wg21.link/CWG2070)。 –

+0

非常感谢,回复更新。 – OmnipotentEntity

相关问题