首页 文章

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

提问于
浏览
18

在这个例子中:

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

T::X 是一个从属名称,它引用 T 中的成员 X . 如果使用 T = X 实例化 S<T>

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

using声明是否会成为继承构造函数?

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

请注意,如果我们写:

using T::X::X;

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

1 回答

  • 4

    感谢T.C.指出这个:

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

    在这种情况下,来自clang的错误消息是有意义的,因为T :: X将是类型X,它触发“从没有typename标签的模板类型”错误 .

    原帖:

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

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

相关问题