1
struct E_Point {
  double x, y;
  E_Point(): x(0), y(0) {}
  E_Point(double x, double y) : x(x), y(y) {}
};

E_Point problem[] = { 
  {0.3871953044519425, -0.91857980824611341}, // Error: initialization of non-aggregate type 'E_Point' with an initializer list
  {0.36139704793723609, 0.91605957361605106}, 
  {-0.8208980020500205, 0.52853407296583088}, 
  {0.36178501611208552, 0.88880385168617226}, 
  {-0.43211245441046209, 0.6803420222771047} 
};

clang3.1でコンパイル。

これは GCC 4.6.1 でコンパイルされることを指摘しておく必要があります。

私の現在の理解ではproblem、それは構造体の配列であるため、非集約型であり、単に構造体または配列だけでなく、複合体になっているということです。

-std=c++11しかし、フラグを送信してclangも問題は軽減されません。

更新:わかりました。私のバージョンの にclangは何らかの欠陥があり、何らかの理由でこれを処理できないようです。

初期化するより伝統的な方法は何ですか? このようにしますか?これはコンパイルされますが、同じコードが生成されますか? オリジナルは呼び出しませんが、ctor を呼び出しますか?

E_Point problem[] = {
    E_Point(0.3871953044519425, -0.91857980824611341), // 1559
    E_Point(0.36139704793723609, 0.91605957361605106), // 1560
    E_Point(-0.8208980020500205, 0.52853407296583088), // 1798
    E_Point(0.36178501611208552, 0.88880385168617226), // 1799
    E_Point(-0.43211245441046209, 0.6803420222771047) // 1800
};
4

1 に答える 1

2

これは clang++ のバグです:

http://llvm.org/bugs/show_bug.cgi?id=12670

あなたの場合、最後のコードスニペットで提供したように、コンストラクターへの明示的な呼び出しを使用できます。セマンティクスが本当に同じかどうか (同じコードを生成するかどうか) については、ほとんどの場合そうです。

構文が異なると動作が異なる場合は、構築される型に を受け取るコンストラクターがstd::initializer_list<>ある場合です。この場合、ブレース初期化子はその初期化子リストを構築します。あなたの場合のように、型にそのようなコンストラクターがない場合、ブレース初期化子は適切なコンストラクターを呼び出します。

于 2012-06-06T13:44:28.913 に答える