6
struct POD { int i, j; };    
class A {
  POD m_pod;
public:
  A() : m_pod({1,2}) {} // error
  A() : m_pod(static_cast<POD>({1,2})) {} // error
  A() : m_pod((POD) {1,2}) {} // ok!
};

我在用 编译的旧生产代码中看到了这一点g++34,直到那时我才知道这个功能。
它是g++的特定功能吗?如果不是那么,为什么需要进行类型转换,而且也只允许 C 风格的转换?

4

2 回答 2

6

实际上,C++ 标准(C++03 和 C++11)不允许使用以下语法:

A() : m_pod((POD) {1,2}) {} // ok!

由于 GCC 编译这个,它是一个 GCC 扩展。

如果你用-pedantic选项编译它,它会给出这个警告:

pod.cpp:8:29:警告:ISO C++ 禁止复合文字


在 C++11 中,你可以这样写:

A() : m_pod{1,2} {}

演示:http: //ideone.com/XaO4y

或者简单地说:

class A {
  POD m_pod {1,2}; //in-place initialization
public:
  A() {}
};

Ideone 不支持这个。

于 2012-06-06T04:40:37.273 回答
5

您使用的语法不仅适用于初始化列表,还适用于在其声明之外的类类型的任何初始化。例如:

POD p;
p = (POD) {1, 2};

这些被称为复合文字;它们在 C99 中被添加到 C 中。C++ 实际上不支持它们;GCC 允许它们在 C++(和 C89)中作为扩展。C++11增加了语法

p = POD({1, 2});

或者在你的情况下:

A() : m_pod(POD({1,2})) {}
于 2012-06-06T04:46:44.530 回答