2012-08-12 8 views
6

Si consideri il seguente codice:La compilazione di questo comportamento standard del codice?

struct Undefined; 

template <typename T> 
void TemplateFunction() 
{ 
    Undefined obj; 
} 

int main() 
{ 
    return 0; 
} 

ero sempre sotto l'impressione che le funzioni dei modelli e metodi di template (o metodi parte di una classe template) saranno controllati solo per la sintassi (a meno che non siano istanziati), nel qual caso il codice sopra deve compilare.

Il problema è che non viene compilato con Xcode (ver: 4.3.2, utilizzando il compilatore LLVM) e ora sto chiedendo se il codice di cui sopra è non standard ossia deve non compila su un compilatore conforme al lo standard C++ 03? L'errore da Xcode è:

variabile ha tipo incompleto "Definire"

noti che nel codice originale, l'oggetto non definito è parte del asserzione statica.

+1

[Ideone sembra consentirgli di compilare.] (Http://ideone.com/PHpFw) (gcc-4.3.4) –

+0

Si compila sotto g ++ 4.6.3 su Linux, e non in clang ++ (anche se capisco che Xcode usa anche clang ++) –

+0

Come previsto, compila con gcc 4.7 e uno snapshot 4.8 (linux su x86) – juanchopanza

risposta

7

Il compilatore ha ragione nel rifiutare il codice, anche se altri compilatori lo accetteranno volentieri. In particolare, la citazione sarebbe all'interno di §14.6 [temp.res]/8

[...] Se non è possibile generare una specializzazione valida per una definizione di modello e tale modello non viene istanziato, la definizione del modello è mal formata, nessuna diagnostica richiesta. [...] Se un tipo utilizzato in un nome non dipendente è incompleta al punto in cui un modello viene definito, ma è completa al punto in cui viene eseguita un'esemplificazione, e se la completezza di quel tipo determina se o no il programma è ben formato o influenza la semantica del programma, il programma è mal formato; [...]

Cioè, il modello è mal formate anche se il compilatore non è tenuto a diagnosticarla.

+0

Potresti chiarirlo un po ': * entrambi * clang e gcc mostrano un comportamento corretto, anche se uno di loro rifiuta questo programma e l'altro lo compila con successo? –

+3

@Nya: Sì, il programma è * mal formati *, in modo da clang è proprio nel rigetto. Ma non è richiesta alcuna diagnostica, quindi gcc ha ragione a ignorare il problema. Ciò non significa che il programma sia corretto, solo che gcc non ha diagnosticato l'errore. In una certa misura questo sarebbe l'equivalente di * comportamento non definito * al momento della compilazione. Potrebbe sembrare che funzioni * anche se non è corretto. Si noti che ci sono molti casi in cui compilatori non sono richieste per la diagnosi, per esempio, due diverse definizioni di un modello di 'inline' è una violazione della ODR, ma i compilatori non sono tenuti per diagnosticare (e la maggior parte non lo fanno) –

Problemi correlati