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 に答える