Смущен неявной реализацией шаблона - PullRequest
5 голосов
/ 07 октября 2010

Это утверждение из стандарта C ++ 03, §14.7.1p5:

Если процесс разрешения перегрузки может определить правильную функцию вызывать без создания экземпляра определения шаблона класса, это не определено, имеет ли место эта реализация на самом деле. [ Пример:

template <class T> struct S {
       operator int();
};

void f(int);
void f(S<int>&);
void f(S<float>);

void g(S<int>& sr) {
        f(sr);     // instantiation of S<int> allowed but not required
                   // instantiation of S<float> allowed but not required
};

- конец примера ]

Я не могу понять этот момент. Есть ли у него неопределенное поведение?

Я обнаружил еще одну похожую проблему , которую я тоже не понимаю. Там объясняется, что правильное поведение не определено, но что это значит?

здесь: MSVC: неявное создание шаблона, хотя шаблонный конструктор не используется

Ответы [ 2 ]

3 голосов
/ 07 октября 2010

Unspecified означает, что

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

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

0 голосов
/ 07 октября 2010

Во время разрешения перегрузки определяется, что правильная функция для вызова при написании f(sr) - void f(S<int>&); без явной реализации определения шаблона класса S, не определено, был ли фактически создан экземпляр вашего класса.

Неопределенное поведение и Неуказанное поведение - это две совершенно разные вещи.

создание экземпляра S разрешено, но не обязательно

Например:

template <class T =int> 
struct S 
{
  operator int();
};

разрешено, но не обязательно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...