Рассмотрим следующий кодОбеспечение статический член класса строится
#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;
}
я ожидал, что это будет печатать «Created», однако, не печатает что-нибудь (протестировано с MSVC и ideone НКУ C++ 11). Является ли это проблемой реализации компилятора, или это поведение поддерживается стандартом? Если прокомментированная строка раскоментирована, она выводится как ожидалось. Есть ли способ для создания static Printer p
без каких-либо изменений в MyClass или дополнительных инструкциях, таких как auto& p = MyClass::p
?
Причина, по которой я заинтересован в этом, я ищу, чтобы создать шаблонный базовый класс, который будет запускать некоторый код при запуске, когда он получен.
Связанный: http://stackoverflow.com/q/18600034/420683 – dyp
[temp.inst]/10 «Реализация не должна неявно экземпляр шаблона функции, [...] или статический член данных шаблон класса, который не требует создания экземпляра ». И, исходя из специализации шаблона класса, не требуется создание экземпляра (определения) его статических элементов данных. – dyp
@ DyP почему это не ответ? –