2012-11-03 210 views

回答

3

在C++ 03中,非靜態成員數組無法像前面提到的那樣初始化。在g ++中,你可以擴展初始化列表,但這是一個C++ 11功能。在功能

局部變量可以初始化這樣的:

char str[] = "str"; // (1) 
char str[] = {'s','t','r',0}; // (2) 

雖然你可以提維度4,但最好沒有提到以避免意外的數組越界。

在這兩種情況下,我都會推薦使用std::string

+0

Comeau編譯C++ 03模式,爲什麼? – FrozenHeart

+0

相信字符數組不能以這種方式初始化的理由是什麼?從我在標準和海灣合作委員會的錯誤數據庫中讀到的內容(請參閱我的答案),我認爲像字符數組可以通過這種方式進行初始化。 – bames53

1

在C++ 03中,這是不可能的。由於非標準擴展,Comeau可能會編譯它。

在C++ 11,你可以這樣做:

Foo() : str({'s','t','r'}) {}  //C++11 only 

或者,你可能更喜歡這種這一翻譯:

class Foo 
{ 
public: 
    Foo() {} 
    char str[4] = "str"; //in-class initialization (C++11 only) 
}; 

此外,您可以考慮使用std::stringstd::vector<char>不論版本你正在使用的C++。

+0

Comeau是一個嚴格的符合ISO的編譯器,所以我不確定這是否是擴展。你確定? – FrozenHeart

+0

@NikitaTrophimov:我確信你不能在C++ 03中做到這一點。 – Nawaz

+0

海灣合作委員會拒絕這一事實已被確認爲GCC臭蟲記者的一個錯誤。 – bames53

4

此代碼是有效的C + + 03和gcc在這裏根本不符合。

允許此語法用於初始化字符數組的語言與允許其用於任何其他類型的語言相同;沒有例外會阻止它在字符數組上使用。 ()=初始化在這些情況下是等價的,字符數組應該根據8.5.2簡單地初始化。

Here's確認的gcc錯誤報告涵蓋了這一點。

+0

+1,確實是一個gcc bug。 gcc輸出錯誤,所以*真正*表現爲非標準構造。 – iammilind

相關問題