2009-11-26 2 views
4

я только обнаружил, что, когда дело доходит до шаблонов этот код компилируется в г ++ 3.4.2 и не работает, если т() не вызывается:Является ли этот код легальным в C++

template <typename T> 
class C 
{ 
    T e; 

    public: 
     C(): e(0) {}; 

    void m() 
    { 
     e = 0; 
    }; 
}; 

Теперь можно создавать и использовать экземпляр

C<const int> c; 

До c.m() не называется там нет ошибки компиляции, но это законно?

ответ

11

Да, это законно. Спецификация шаблона заключается в том, что до тех пор, пока не будет создан метод, он не существует и не проверяется компилятором. Вот соответствующий бит от the spec:

14.7.1 - неявная конкретизация

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

+2

В целом, правильно, но если быть точнее, он должен говорить о методе, который создается, а не вызван. Помимо вызова его, выполнение указателя на него также сделает это; и если метод является виртуальным, то он определяется реализацией, если отсылка отложена или нет. –

+1

По крайней мере, все зависит от типа шаблона. Существует некоторая путаница с независящими ошибками. Например, VC++ допускает даже полный тарабар в этом методе, если вы его не вызываете ('non-sense here;'), однако другие компиляторы не согласятся с тем, что даже если вы не создаете экземпляр шаблона вообще (что вероятно, правильнее). – UncleBens

+0

Кто-нибудь знает, каково намерение стандартного? Мне не нужно, например, специализировать код для константной версии шаблона, по крайней мере, на текущем уровне моего приложения (вероятно, я буду в будущем для ясности). Но разве это дело? – doc

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