2012-08-12 14 views
6

Rozważmy następujący kod:Czy kompilacja tego kodu jest zachowaniem standardowym?

struct Undefined; 

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

int main() 
{ 
    return 0; 
} 

Zawsze byłem pod wrażeniem, że funkcje szablonów i metody szablonu (lub metody częścią klasy szablonu) będą sprawdzane tylko dla składni (chyba że są one instancja), w którym to przypadku powyższy kod: powinien być kompilowany w postaci.

Problem w tym, że nie skompilować z Xcode (ver: 4.3.2, kompilator LLVM pomocą) i teraz zastanawiam się, czy powyższy kod jest niestandardowa czyli powinno nie skompilować na kompilator zgodny standard C++ 03? Błąd z Xcode jest:

zmienna ma niekompletne typu „Undefined”

Należy zauważyć, że w oryginalnym kodzie niezdefiniowany obiekt jest częścią statyczną twierdzenia.

+1

[Ideone wydaje się pozwalać na kompilację.] (Http://ideone.com/PHpFw) (gcc-4.3.4) –

+0

Kompiluje się pod g ++ 4.6.3 na Linuksie i nie jest pod kluczem ++ (chociaż jeśli rozumiem poprawnie, Xcode również używa clang ++) –

+0

Zgodnie z oczekiwaniami, kompiluje się z gcc 4.7 i migawką 4.8 (linux na x86). – juanchopanza

Odpowiedz

7

Kompilator ma rację odrzucając kod, mimo że inni kompilatorzy chętnie go zaakceptują. W szczególności oferta będzie zawierać się w § 14.6 [temp.res]/8

[...] Jeśli dla definicji szablonu nie można wygenerować prawidłowej specjalizacji, a ten szablon nie jest tworzony, definicja szablonu to źle sformułowany, nie wymaga diagnostyki. [...] Jeżeli typ użyty w nazwie niezależnej jest niekompletny w punkcie, w którym zdefiniowano szablon, ale jest kompletny w momencie, w którym wykonywane jest tworzenie instancji, a kompletność tego typu wpływa na to, czy program jest dobrze uformowany lub wpływa na semantykę programu, program jest źle sformułowany; [...]

Oznacza to, że szablon jest źle sformułowane chociaż kompilator nie jest wymagane, aby ją zdiagnozować.

+0

Czy możesz wyjaśnić to nieco: * Oba * clang i gcc wykazują prawidłowe zachowanie, mimo że jeden z nich odrzuca ten program, a inny z powodzeniem go kompiluje? –

+3

@Nya: Tak, program jest * źle sformułowany *, więc klang ma rację, odrzucając go. Ale diagnostyka nie jest wymagana, więc gcc ma rację, ignorując problem. To nie znaczy, że program jest dobry, tylko że gcc nie zdiagnozował błędu. W pewnym stopniu będzie to równoznaczne z * niezdefiniowanym zachowaniem * podczas kompilacji. Może się wydawać, że * działa *, chociaż jest niepoprawny. Zauważ, że istnieje wiele przypadków, w których kompilatory nie są wymagane do diagnozowania, na przykład dwie różne definicje szablonu 'inline' są naruszeniem ODR, ale kompilatory nie są wymagane do diagnozowania (i większość nie robi) –

Powiązane problemy