4

このウィキペディアのページから次の例をコピーしました。

struct BasicStruct {
    int x;
    double y;
};

struct AltStruct {
    AltStruct(int x, double y) : x_{x}, y_{y} {}

private:
    int x_;
    double y_;
};

BasicStruct var1{5, 3.2};
AltStruct var2{2, 4.3};

int main (int argc, char const *argv[])
{
    return 0;
}

それから私はそれをコンパイルしようとしました

clang++ -Wall -std=c++11 test.cpp 

しかし、私はこのエラーを受け取ります:

test.cpp:17:11: error: non-aggregate type 'AltStruct' cannot be initialized with
      an initializer list
AltStruct var2{2, 4.3};
          ^   ~~~~~~~~
1 error generated.

私のclangバージョンclang++ --version

Apple clang version 3.1 (tags/Apple/clang-318.0.61) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin11.4.0
Thread model: posix

この例は機能しませんか?たぶん、clangはまだ完全にc ++ 11と互換性がありませんか?

どうしたの?

4

2 に答える 2

7

ヒントは実際にここにあります:

Apple clang version 3.1 (tags/Apple/clang-318.0.61) (based on LLVM 3.1svn)
                                                                   ^~~~~~

これは、3.1バージョンではなく、3.0から3.1の間のどこかにあることを意味します。

均一な初期化のサポートは、これら2つのバージョンの間のどこかに実装されているため、Appleが持っているバージョンは、おそらくまったくサポートされていないか、部分的にしかサポートされていません。

于 2012-07-12T12:02:33.760 に答える
0

エラー:非集計タイプ'AltStruct'はイニシャライザリストで初期化できません

それは間違いなく間違っています。8.5.4リストの初期化[dcl.init.list]§3を参照してください。

タイプTのオブジェクトまたは参照のリスト初期化は次のように定義されます。

  • Tが集合体の場合、集合体の初期化が実行されます
  • [...]
  • それ以外の場合、Tがクラス型の場合、コンストラクターが考慮されます

そしてAltStruct、コンストラクターがintとをとっているのでdouble、コンパイルして(直接初期化)AltStruct var2{2, 4.3};と同じセマンティクスを持つ必要があります。AltStruct var2(2, 4.3);

于 2012-07-12T10:12:41.817 に答える