考虑以下代码:
#include <iostream>
struct M {
M() { std::cout << "Mn"; }
};
template <class T>
struct Test {
Test() { std::cout << "Testn"; }
inline static auto m = M{};
};
int main() {
Test<int> t1;
//Test t;
//(void)&t1.m;
}
使用最新的GCC或Clang;测试";打印出来。但是,如果我们使用m
对象的地址(取消对最后一行(void)&t1.m;
的注释(或将Test
类模板转换为常规(非模板化(类,则会调用M
构造函数。
C++标准允许这种行为吗?有报价吗?
是的,它在标准中有详细说明。
[temp.inst](强调矿(
4除非类模板或成员模板的成员是声明的专业化,成员的专业化是在需要成员定义存在的上下文,或者如果成员定义的存在会影响程序特别是初始化(以及任何相关的端除非静态数据成员本身的使用方式需要定义静态数据成员是否存在。
由于您的示例根本不使用静态数据成员,因此其定义从未完全实例化。