该代码可以编译吗?
#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,但显然没有被接受