在C++的构造函数初始化列表中初始化字符数组。

6
这样使用初始化是否可行?
class Foo
{
public:
   Foo() : str("str") {}
   char str[4];
};

还有这个?

int main()
{
   char str[4]("str");
}

在gcc 4.7.2中,两者都会给我一个错误:

错误:数组用作初始化器

Comeau可以编译两者。


clang也可以在C++03模式下编译这两个。 - bames53
3个回答

5

在C++03中,非静态成员数组不能像你提到的那样初始化。在g ++中,您可以具有初始化列表扩展,但这是一个C ++ 11的功能。

函数中的局部变量可以像这样初始化:

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

虽然你可以将维度标记为4,但最好不要提及,以避免意外的数组越界。我建议在这两种情况下使用std::string

Comeau可以同时编译C++03模式,为什么? - FrozenHeart
字符数组不能用这种方式初始化的理由是什么?从我在标准和gcc错误数据库中所读到的内容来看(请参见我的答案),我认为字符数组可以用这种方式进行初始化。 - bames53

5
这段代码是有效的C++03,而gcc在此处不符合标准。 允许使用此语法初始化字符数组的语言与允许任何其他类型的语法相同;没有任何例外禁止它用于字符数组。在这些情况下,“()”和“=”初始化是等效的,字符数组应按照8.5.2进行初始化。 这里是一个已确认的gcc错误报告(链接)

+1,确实是gcc的一个bug。gcc打印错误信息时非常“真实”,以至于看起来像是非标准结构。 - iammilind

3
在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)
};

此外,无论您使用哪个版本的C ++,您可能考虑使用std :: stringstd :: vector <char>

Comeau是一个严格的ISO兼容编译器,所以我不确定这是否是一个扩展。你确定吗? - FrozenHeart
@NikitaTrophimov:我非常确定你无法在C++03中完成这个。 - Nawaz
GCC 拒绝这一事实已经在 GCC 缺陷报告中确认为缺陷。 - bames53

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接