可以像这样使用初始化吗?
class Foo
{
public:
Foo() : str("str") {}
char str[4];
};
这个?
int main()
{
char str[4]("str");
}
两个都在gcc 4.7.2中给我一个错误:
错误:用作初始化程序的数组
Comeau编译两者。
答案 0 :(得分:5)
这段代码是有效的C ++ 03,gcc在这里根本不符合。
允许此语法初始化字符数组的语言与允许任何其他类型的语言相同;没有例外会禁止它在字符数组上使用。在这些情况下,()
和=
初始化是等效的,字符数组应该根据8.5.2进行初始化。
Here's确认的gcc错误报告,涵盖了这一点。
答案 1 :(得分:4)
在C ++ 03中,无法按照您的提及初始化非静态成员数组。在g ++中你可以拥有初始化列表的扩展名,但这是一个C ++ 11特性。
函数中的局部变量可以像这样初始化:
char str[] = "str"; // (1)
char str[] = {'s','t','r',0}; // (2)
虽然您可以将维度称为4
,但最好未提及以避免意外数组越界。
我建议在两种情况下使用std::string
。
答案 2 :(得分:2)
在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 ++版本。