使用像這樣的初始化可以嗎?初始化C++構造函數的初始化列表中的char數組
class Foo
{
public:
Foo() : str("str") {}
char str[4];
};
而這個?
int main()
{
char str[4]("str");
}
兩個給我一個錯誤在GCC 4.7.2:
error: array used as initializer
科莫編譯兩者。
使用像這樣的初始化可以嗎?初始化C++構造函數的初始化列表中的char數組
class Foo
{
public:
Foo() : str("str") {}
char str[4];
};
而這個?
int main()
{
char str[4]("str");
}
兩個給我一個錯誤在GCC 4.7.2:
error: array used as initializer
科莫編譯兩者。
在C++ 03中,非靜態成員數組無法像前面提到的那樣初始化。在g ++中,你可以擴展初始化列表,但這是一個C++ 11功能。在功能
局部變量可以初始化這樣的:
char str[] = "str"; // (1)
char str[] = {'s','t','r',0}; // (2)
雖然你可以提維度4
,但最好沒有提到以避免意外的數組越界。
在這兩種情況下,我都會推薦使用std::string
。
Comeau編譯C++ 03模式,爲什麼? – FrozenHeart
相信字符數組不能以這種方式初始化的理由是什麼?從我在標準和海灣合作委員會的錯誤數據庫中讀到的內容(請參閱我的答案),我認爲像字符數組可以通過這種方式進行初始化。 – bames53
在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::string
或std::vector<char>
不論版本你正在使用的C++。
Comeau是一個嚴格的符合ISO的編譯器,所以我不確定這是否是擴展。你確定? – FrozenHeart
@NikitaTrophimov:我確信你不能在C++ 03中做到這一點。 – Nawaz
海灣合作委員會拒絕這一事實已被確認爲GCC臭蟲記者的一個錯誤。 – bames53
clang也在C++ 03模式下編譯這兩個。 – bames53