Является ли этот код законным в C ++ - PullRequest
4 голосов
/ 27 ноября 2009

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

template <typename T>
class C
{
     T e;

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

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

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

C<const int> c;

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

1 Ответ

11 голосов
/ 27 ноября 2009

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

14.7.1 - Неявная реализация

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

...