2010-10-07 9 views
5

To stwierdzenie od standardowej C++ 03, §14.7.1p5:Confused o niejawny szablonu konkretyzacji

Jeśli proces rozdzielczości przeciążenie może określić prawidłową funkcję zadzwonić bez instancji definicję klasy szablonu , to jest nieokreślone, czy ta instancja faktycznie ma miejsce. [przykład:

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

- przykład koniec]

mogę zrozumieć ten punkt. Czy ma niezdefiniowane zachowanie?

Znalazłem inny similar problem, którego również nie rozumiem. Wyjaśniono, że prawidłowe zachowanie jest niezdefiniowane, ale co to znaczy?

tutaj: MSVC: Implicit Template Instantiation, though templated constructor not used

Odpowiedz

0

Podczas rozdzielczości przeciążenia stwierdzenia, że ​​prawidłowa funkcja zadzwonić kiedy piszesz f(sr) jest void f(S<int>&); bez wyraźnie instancji definicję klasy szablonu S jest nieokreślona, ​​czy klasa jest faktycznie instancja.

Niezdefiniowane zachowanie i Nieokreślone zachowanie to dwie zupełnie różne rzeczy.

instancji od S < Int> możliwe, ale nie jest wymagane

Na przykład

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

jest możliwe, ale nie jest wymagane.

3

Nieokreślony oznacza, że ​​

  1. to do kompilatora, czy będzie to faktycznie instancję szablonie klasy czy nie i
  2. projektantów kompilatora musi wybrali jakąś strategię w przypadku takich sytuacji i projektantów kompilatorów nie jest wymagane udokumentowanie ich wyboru.

W każdym razie jest to poprawne zachowanie w przeciwieństwie zachowanie niezdefiniowane co jest błędne zachowanie. Szczegółowe objaśnienie można znaleźć w this related question.

+0

Chociaż [Definicje C++] (http://stackoverflow.com/q/2047172/54262) może pomóc mu bardziej niż C, ponieważ najwyraźniej ma kopię standardu C++. –

+0

Znam nieokreślone/Nieokreślone/Ostrzeżenia o zachowaniu zdefiniowane w ramach implementacji ..Ale potrzebuję wyjaśnienia na temat tego programu .. –

Powiązane problemy