在 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 时的构造函数。
在这个例子中:
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 时的构造函数。