2010-10-07 2 views
5

Это заявление от C++ 03 стандарта, §14.7.1p5:Confused о неявном шаблоне конкретизации

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

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 
}; 

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

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

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

здесь: MSVC: Implicit Template Instantiation, though templated constructor not used

ответ

0

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

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

конкретизацией S < межд> разрешено, но не требуется

Например:

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

допускается, но не требуется.

3

Не выбрано означает, что

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

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

+0

Хотя [определения C++] (http://stackoverflow.com/q/2047172/54262) может помочь ему больше, чем C, так как он, очевидно, имеет копию стандарта C++. – 2010-10-07 10:44:16

+0

Я знаю Undefined/Unspecified/Определения поведения, определенные при реализации. Но мне нужно уточнить эту программу. – 2010-10-07 11:01:43

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