2012-08-12 23 views
6

考慮下面的代碼:這個代碼標準行爲的編譯?

struct Undefined; 

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

int main() 
{ 
    return 0; 
} 

我一直的印象是模板函數和模板方法(或方法的模板類的一部分)將只對語法進行檢查(除非它們被實例化),在這種情況下,下上面的代碼應該編譯。

問題是,它不與Xcode的編譯(版本:4.3.2,使用LLVM編譯器)和現在我想知道上面的代碼是否是非標準即它應該不編譯器符合編譯C++ 03標準?從Xcode的錯誤是:

變量具有不完整的類型「未定義」

注意的是,在原始代碼中,未定義的對象是靜態斷言的一部分。

+1

[Ideone似乎允許它編譯。](http://ideone.com/PHpFw)(gcc-4.3.4) – 2012-08-12 00:42:23

+0

它在Linux下的g ++ 4.6.3下編譯,並且它不在clang ++下(儘管如果我理解正確,Xcode也使用clang ++) – 2012-08-12 00:42:27

+0

正如預期的那樣,它使用gcc 4.7和4.8快照編譯(linux上的x86) – juanchopanza 2012-08-12 00:46:05

回答

7

即使其他編譯器會很樂意接受它,編譯器仍然拒絕代碼。特別是該報價將在§14.6[temp.res]/8內

[...]如果沒有有效的專業化可以爲模板定義生成,並且該模板未實例化,則模板定義爲不合格,不需要診斷。 [...]如果在非獨立名稱中使用的類型在定義模板的地方是不完整的,但是在實例化完成的地方是完整的,並且該類型的完整性是否會影響該程序格式良好或影響程序的語義,程序不合格; [...]

也就是說,模板是雖然診斷它的編譯器不需要形成不良

+0

請您澄清一下:* clang和gcc都顯示正確的行爲,他們拒絕這個程序和其他人成功地編譯它? – 2012-08-12 00:50:12

+3

@Nya:是的,該計劃*形式不良*,所以鏗鏘拒絕它是正確的。但不需要診斷,因此gcc無視此問題。這並不意味着程序是正確的,只是gcc沒有診斷錯誤。在某種程度上,這與編譯時的*未定義行爲*相當。它可能似乎*工作*雖然它是不正確的。請注意,在很多情況下編譯器不需要進行診斷,例如,兩個不同的「內聯」模板定義是違反ODR的,但編譯器不需要診斷(並且大多數不這樣做) – 2012-08-12 00:53:32

相關問題