该代码可以编译吗?
#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,但显然它没有被接受
1 回答
您的示例与defect report中的示例不同 . 在缺陷报告中,
CL
是一个类模板 . 但是,提议的解决方案的目的是使模板案例与非模板案例相同,即[basic.scope.pdecl]:然后提出的决议:
截至最新的draft,非模板案例仍然有效 . 模板案例不是 . 但是缺陷是drafting,这意味着模板案例旨在编译 .