[英]Point of instantiation of a template class
该代码可以编译吗?
#include <iostream>
template <typename T>
struct TMPL
{
using TP = typename T::TP; //is CL::TP visible (with T == CL)?
};
struct CL
{
using TP = int;
TMPL<CL>::TP val;
};
int main()
{
CL cl;
}
根据标准14.6.4.1/4,在CL类定义之前立即实例化TMPL
对于类模板特化,...,如果特化是隐式实例化的,因为它是从另一个模板特化中引用的, 否则,这种特化的实例化点紧接在命名空间范围声明或引用的定义之前专业化。
因此,CL :: TP在TMPL实例化点中不可见,但所有编译器(MSVC,gcc,clang)都编译得很好。 我还发现了一份缺陷报告http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#287 ,但显然未被接受
您的示例与缺陷报告中的示例不同。 在缺陷报告中, CL
是一个类模板。 但是,提议的解决方案的目的是使模板案例与非模板案例相同,即[basic.scope.pdecl] :
6在声明类成员之后,可以在其类的范围内查找成员名称。 [ 注意:即使班级是不完整的班级,也是如此。 例如,
struct X { enum E { z = 16 }; int b[X::z]; // OK };
- 结束说明 ]
然后提出的决议:
在14.6.4.1 [temp.point]第3段中更改:
实例化的重点紧接在封闭模板的实例化之前。 否则,这种特化的实例化点紧接在引用特化的命名空间范围声明或定义之前。
至:
实例化的点与封闭模板的实例化点相同 。 否则,这种专业化的实例化点将紧接在最近的封闭声明之前。 [注意:实例化的重点仍然是命名空间范围,但实例化之前的任何声明,即使不在命名空间范围内,都被视为已被看到。
添加以下第3段:
如果隐式实例化的类模板特化,类成员特化或类模板的特化引用类,类模板特化,类成员特化或包含直接或间接导致实例化的特化引用的类模板的特化,则要求完整性和类引用的排序在专业化参考的上下文中应用。
截至最新草案 ,非模板案例仍然有效。 模板案例不是。 但缺点是起草 ,这意味着模板案例旨在编译。
起草:工作组已达成非正式共识,并在暂定决议中粗略描述,尽管尚未提供有关变更的准确措辞。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.