Создание экземпляра функции-члена

Следующие компиляции на GCC 4.8.1 (с --std=c++11):

struct non_default_constructible { non_default_constructible() = delete; };

template<class T>
struct dummy {
    T new_t() { return T(); }
};

int main(int argc, char** argv) {
    dummy<non_default_constructible> d;
    return 0;
}

Сложная часть состоит в том, что dummy<non_default_constructible>::new_t() явно плохо сформирован, но это не мешает компилятору создавать экземпляры dummy<non_default_constructible>.

Это поведение, указанное стандартом? И какими будут соответствующие разделы/ключевые слова?

Ответ 1

Функции-члены шаблона класса создаются только тогда, когда это требуется контекстом, что означает, что вы не увидите никакой ошибки, пока не попытаетесь использовать new_t(). Связанный раздел из стандарта С++:

§ 14.7.1 Неявное создание экземпляра [temp.inst]

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

  2. [Пример:

    template<class T> struct Z {
      void f();
      void g();
    };
    
    void h() {
      Z<int> a;     // instantiation of class Z<int> required
      Z<char>* p;   // instantiation of class Z<char> not required
      Z<double>* q; // instantiation of class Z<double> not required
      a.f();        // instantiation of Z<int>::f() required
      p->g();       // instantiation of class Z<char> required, and
                    // instantiation of Z<char>::g() required
    }
    

    Ничто в этом примере не требует class Z<double>, Z<int>::g() или Z<char>::f() неявно инстанцирован. - конец примера]