12

C++11 では、{} スタイルの初期化が導入されました。しかし、これらの2つの形式は

T x {...};
T x = {...};

同じ?

4

3 に答える 3

13

それらはまったく同じではありません。たぶん、これは反例で説明できます:

struct Foo
{
  explicit Foo(std::initializer_list<int>) {}
};

int main()
{
  Foo f0{1, 2, 3};    // OK
  Foo f1 = {1, 2, 3}; // ERROR
}

したがって、2 番目のバリアントでは、型が初期化リストから暗黙的に構築可能である必要がありますが、最初のバージョンではそうではありません。同じことがフォームのコンストラクタにも当てはまることに注意してくださいFoo(int, int, int)initializer_list<int>を勝手に選んでみました。

これは、「どこでも明示的」な哲学に従って書かれた特定の型に影響を与えます (これによりexplicit、C++03 コードではマルチパラメーター コンストラクターがマークされていましたが、その標準では意味がありませんでした)。

于 2014-03-15T17:39:13.733 に答える
1

ある場合にそれらを使用する場合の構文は、異なることを意味します

struct A { };

namespace X {
  struct A final {};
  struct A final = {};
}

最初のケースでは という構造体を定義してAおり、2 番目のケースでは というオブジェクトを定義していますfinal

于 2014-03-15T19:39:58.403 に答える