2010-10-07 29 views
5

Este es el comunicado de la 03 C++ estándar, §14.7.1p5:Confundido sobre implícita de instancias de plantilla

Si el proceso de resolución de sobrecarga puede determinar la función correcta llamar sin crear instancias de una definición de plantilla de clase , es no especificado si esa instanciación realmente tiene lugar. [Ejemplo:

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

- ejemplo extremo]

Soy incapaz de comprender este punto. ¿Tiene un comportamiento indefinido?

Encontré otro similar problem, que tampoco entiendo. Allí se explica que el comportamiento correcto no está definido, pero ¿qué significa eso?

aquí: MSVC: Implicit Template Instantiation, though templated constructor not used

Respuesta

0

Durante la resolución de sobrecarga se determina que la función correcta para llamar al escribir f(sr) es void f(S<int>&); sin crear instancias explícitamente la definición de plantilla de clase S, queda sin especificar si su clase es en realidad una instancia.

El comportamiento indefinido y el comportamiento no especificado son dos cosas completamente diferentes.

instanciación de S < int> permitió pero no se requiere

Por ejemplo: se permite

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

pero no se requiere.

3

no especificado significa que

  1. le toca al compilador si será en realidad una instancia de la clase de plantilla o no y
  2. los diseñadores compilador debe haber elegido la estrategia para tratar con tales situaciones y
  3. los diseñadores de compiladores no están obligados a documentar su elección.

De todas formas esto es correcto comportamiento a diferencia de comportamiento indefinido que es un comportamiento erróneo. Vea this related question para una explicación detallada.

+0

Aunque las [definiciones C++] (http://stackoverflow.com/q/2047172/54262) podrían ayudarlo más que a C, ya que aparentemente tiene una copia del estándar C++. –

+0

Conozco las advertencias de comportamiento no definidas/no especificadas/implementadas. Pero necesito una aclaración sobre este programa. –

Cuestiones relacionadas