2010-10-07 13 views
5

Questa è la dichiarazione del C++ 03 di serie, §14.7.1p5:Confuso su implicita modello di istanza

Se il processo di risoluzione di sovraccarico può determinare la funzione corretta di chiamare senza istanziare una definizione di modello di classe , è non specificato se quell'istanziazione ha effettivamente luogo. [Esempio:

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

- fine esempio]

Non riesco a capire questo punto. Ha un comportamento indefinito?

ho trovato un altro similar problem, che anche io non capisco. Qui viene spiegato che il comportamento corretto non è definito, ma cosa significa?

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

risposta

0

Durante la risoluzione di sovraccarico si è determinato che la funzione giusta da chiamare quando si scrive f(sr) è void f(S<int>&); senza istanziare esplicitamente la definizione di modello di classe S, è specificato se la classe è in realtà un'istanza.

comportamento non definito e il comportamento non specificato sono due cose completamente diverse.

istanziazione di S < int> consentito ma non necessaria

Ad esempio:

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

è consentito ma non necessaria.

3

specificato significa che

  1. tocca al compilatore se sarà effettivamente creare un'istanza della classe su modelli o meno e
  2. i designer compilatore deve hanno scelto qualche strategia per affrontare tali situazioni e
  3. i progettisti del compilatore non sono tenuti a documentare la loro scelta.

In ogni caso questo è un comportamento corretto a differenza comportamento indefinito che è un comportamento errato. Vedere this related question per una spiegazione dettagliata.

+0

Anche se il [C++ definizioni] (http://stackoverflow.com/q/2047172/54262) potrebbe aiutarlo più di C del, dal momento che ha apparentemente una copia dello standard C++. –

+0

Conosco le avvertenze sul comportamento definite/non specificate/definite dall'implementazione .. Ma ho bisogno di un chiarimento su questo programma .. –