6

像这样使用初始化可以吗?

class Foo
{
public:
   Foo() : str("str") {}
   char str[4];
};

和这个?

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

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

错误:数组用作初始化器

Comeau 编译了两者。

4

3 回答 3

5

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

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

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

虽然您可以将维度称为4,但最好不要提及以避免意外数组越界。

我建议std::string在这两种情况下都使用。

于 2012-11-03T06:13:14.523 回答
5

这段代码是有效的 C++03 并且 gcc 在这里根本不符合。

允许这种语法初始化字符数组的语言与允许它用于任何其他类型的语言相同;没有任何例外会禁止它用于字符数组。()=初始化在这些情况下是等价的,字符数组应该根据 8.5.2 简单地初始化。

这是一个已确认的 gcc 错误报告,涵盖了这一点。

于 2012-11-03T07:18:17.427 回答
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)
};

此外,您可能会考虑使用std::stringstd::vector<char>不考虑您正在使用的 C++ 版本。

于 2012-11-03T06:19:13.850 回答