考虑以下代码
#include <iostream>
using namespace std;
struct Printer{
Printer(){
std::cout << "Created\n";
}
};
template<class Derived>
struct InitPrinter{
static Printer p;
};
template<class Derived>
Printer InitPrinter<Derived>::p;
struct MyClass:InitPrinter<MyClass>{
MyClass(){}
};
// Uncomment line below to print out created
//auto& p = MyClass::p;
int main() {
return 0;
}
我希望这会打印出“已创建”,但是,它不会打印出任何内容(使用 MSVC 和 ideone gcc c++11 进行了测试)。这是编译器实现问题,还是标准支持这种行为?如果注释掉的行没有注释,那么它会按预期打印出来。有什么方法可以在static Printer p
不需要更改 MyClass 或额外的语句(如auto& p = MyClass::p
?
我对此感兴趣的原因是我希望创建一个模板化的基类,当它派生时它将在启动时运行一些代码。