2014-07-09 24 views
2

函數模板考慮以下(人工)示例的變量時:錯誤傳遞聲明爲`的extern炭[]`到在VC

template <typename T> 
void f(const T&) {} 

extern char test[]; 

int main() { 
    f(test); 
} 

char test[] = ""; 

GCC和鏘編譯成功,但Visual C++給出以下錯誤:

test.cc(7): error C2664: 'f' : cannot convert parameter 1 from 'char []' to 'const char (&)[1]' [...vcxproj] Reason: cannot convert from 'char []' to 'const char [1]' There is no context in which this conversion is possible

爲什麼VC++會出現此錯誤,而其他編譯器接受代碼以及如何避免此錯誤?

+0

爲了避免錯誤,請停止使用C風格的數組......他們沒有適當的值語義 –

回答

3

引用C++ 11 8.3.5-8:

If the type of a parameter includes a type of the form 「pointer to array of unknown bound of T」 or 「reference to array of unknown bound of T,」 the program is ill-formed.

在那個f(test)被調用的時候,test具有類型char [],並T扣除到char []。那麼f將有const char(&)[]類型的參數,這是不允許的。

所以VC++是正確的。它可能是編譯器的擴展或錯誤,如果它接受這個。

0

事實證明這是一個C++ Language Core Language Issue 393與刪除該條款

If the type of a parameter includes a type of the form 「pointer to array of unknown bound of T」 or 「reference to array of unknown bound of T,」 the program is ill-formed.

這就是GCC和鏘都這樣做的建議的決議。在這種情況下,EDG前端(由Visual C++使用)開發人員選擇發佈錯誤,儘管術語「包含類型」未由標準定義。