【问题标题】:Initialize array of char in initialization list of constructor in C++在 C++ 中的构造函数初始化列表中初始化 char 数组
【发布时间】:2012-10-23 18:41:30
【问题描述】:

这样使用初始化可以吗?

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

还有这个?

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

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

错误:数组用作初始化器

Comeau 编译两者。

【问题讨论】:

  • clang 也在 C++03 模式下编译这两个。

标签: c++ arrays class initialization-list


【解决方案1】:

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

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

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

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

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

【讨论】:

  • Comeau 都在 C++03 模式下编译,为什么?
  • 相信字符数组不能以这种方式初始化的理由是什么?根据我在标准和 gcc 错误数据库中阅读的内容(请参阅我的答案),在我看来,字符数组可以这样初始化。
【解决方案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::stringstd::vector<char>,无论您使用的是什么版本的C++。

【讨论】:

  • Comeau 是一个严格符合 ISO 标准的编译器,所以我不确定这是一个扩展。你确定吗?
  • @NikitaTrophimov:我很确定你不能在 C++03 中做到这一点。
  • GCC 拒绝这一事实已被确认为 GCC 错误报告中的错误。
【解决方案3】:

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

允许这种语法初始化字符数组的语言与允许它用于任何其他类型的语言相同;没有任何例外会禁止它用于字符数组。 ()= 在这些情况下的初始化是等价的,字符数组只需按照 8.5.2 进行初始化即可。

Here's 已确认的 gcc 错误报告涵盖了这一点。

【讨论】:

  • +1,确实是 gcc 错误。 gcc 会真正地​​打印出错误,使其显示为非标准构造。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 2020-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多