2013-11-13 2 views
3

Рассмотрим следующий кодОбеспечение статический член класса строится

#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?

Причина, по которой я заинтересован в этом, я ищу, чтобы создать шаблонный базовый класс, который будет запускать некоторый код при запуске, когда он получен.

+0

Связанный: http://stackoverflow.com/q/18600034/420683 – dyp

+3

[temp.inst]/10 «Реализация не должна неявно экземпляр шаблона функции, [...] или статический член данных шаблон класса, который не требует создания экземпляра ». И, исходя из специализации шаблона класса, не требуется создание экземпляра (определения) его статических элементов данных. – dyp

+0

@ DyP почему это не ответ? –

ответ

2

Подходящая цитата [temp.inst]/2

Если член шаблона класса или шаблон члена не был явно инстанциирован явно специализирован, специализация члена неявно инстанцирована при специализация ссылается на в контексте, который требует определения члена; , в частности, инициализация (и любые связанные с ней побочные эффекты ) статического члена данных не происходит, если сам статический элемент данных не используется в качестве способа , который требует определения статического члена данных.

внимание мое.


Там же [temp.inst]/1

неявная конкретизация шаблон класса специализация вызывает неявные экземпляров деклараций, но не из определений или аргументов по умолчанию, из функции-члены класса, классы членов, область действия перечислений члены, статические элементы данных и шаблоны членов [...]

и [temp.inst]/10

Реализация не должна неявно создавать экземпляр шаблона функции [...] или статического члена данных шаблона класса, который не требует создания экземпляра.

Смежные вопросы