C ++ 11クラス内初期化子が括弧を使用できないのはなぜですか?

デルフィファースト

たとえば、私はこれを書くことはできません:

class A
{
    vector<int> v(12, 1);
};

私はこれしか書くことができません:

class A
{
    vector<int> v1{ 12, 1 };
    vector<int> v2 = vector<int>(12, 1);
};

C ++ 11言語設計の違いに関する考慮事項は何ですか?

プラエトリアニ

考えられる理由の1つは、括弧を許可すると、すぐ最も厄介な解析戻ることです。以下の2つのタイプを検討してください。

struct foo {};
struct bar
{
  bar(foo const&) {}
};

これで、bar初期化するタイプのデータメンバーがあるので、次のように定義します。

struct A
{
  bar B(foo());
};

しかし、上記で行ったBことは、bar値によってオブジェクトを返すという名前の関数を宣言し、署名を持つ関数である単一の引数を取りますfoo()(を返し、foo引数を取りません)。

この問題を扱うStackOverflowで尋ねられる質問の数と頻度から判断すると、これはほとんどのC ++プログラマーが驚くべき直感的ではないと感じるものです。新しい中括弧または等しい初期化子構文を追加することは、このあいまいさを回避し、白紙の状態から始めるチャンスでした。これが、C ++委員会がそうすることを選択した理由である可能性があります。

bar B{foo{}};
bar B = foo();

上記の両方の行は、予想どおりB、タイプという名前オブジェクトを宣言していますbar


上記の当て推量とは別に、上記の例では2つの大きく異なることを行っていることを指摘したいと思います。

vector<int> v1{ 12, 1 };
vector<int> v2 = vector<int>(12, 1);

最初の行は初期化するv12つの要素を含むベクターに、12および12つ目は、それぞれがに初期化さv2れた12要素を含むベクトル作成1ます。

この規則に注意してください。型がをとるコンストラクターを定義している場合、型の初期化子がbraced-init-listの場合、initializer_list<T>そのコンストラクターが常に最初に考慮されます他のコンストラクターは、を取っているコンストラクターがinitializer_list実行可能でない場合にのみ考慮されます

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

マクロでC ++ 11ブレースの初期化を使用できないのはなぜですか?

分類Dev

C:中括弧で配列内の構造体を初期化できないのはなぜですか?

分類Dev

C#で中括弧なしでスイッチセクション内でusing変数を使用できないのはなぜですか?

分類Dev

std :: vectorの文字列リテラル初期化子リストでC ++でstd :: vector <std :: string>を作成できないのはなぜですか?

分類Dev

C ++ 11がC99として指定された初期化子リストをサポートしないのはなぜですか?

分類Dev

親の初期化が機能するのに、コンストラクタ初期化リストのC ++ 11中括弧の初期化が機能しないのはなぜですか?

分類Dev

C ++で、初期化子リストで基本クラスのテンプレート引数を繰り返す必要があるのはなぜですか?

分類Dev

C ++ 11 / C ++ 14の自動およびブレース付き初期化子に特別な型推定規則があるのはなぜですか?

分類Dev

なぜC ++は、派生クラスが初期化リストで基本クラスのメンバーを使用することを許可しないのですか?

分類Dev

C ++ 20が順不同の指定初期化子をサポートしないのはなぜですか?

分類Dev

C ++ 11中括弧の初期化構文を使用して、単純な集計の簡単なコンストラクターを宣言しないようにすることはできますか?

分類Dev

Cでは、const変数を配列サイズの初期化子として使用できないのはなぜですか?

分類Dev

C ++ :(重複していない)クラス内で初期化された(宣言されただけではない)統合静的メンバーがリンカーエラーを引き起こすのはなぜですか?

分類Dev

C ++ 11でconst関数を使用してクラスを変更できるのはなぜですか?

分類Dev

C ++:「配列初期化子は初期化子リストまたは文字列リテラルでなければなりません」というエラーが発生するのはなぜですか?

分類Dev

次のメンバー初期化子がC ++で機能しないのはなぜですか

分類Dev

指定された初期化子がC ++で機能するのはなぜですか?

分類Dev

可変個引数関数がC ++ 11のリスト初期化引数を「食べる」ことができないのはなぜですか?

分類Dev

C ++ 11でオブジェクトを初期化するために、括弧()と初期化子{}構文をいつ使用する必要がありますか?

分類Dev

aspx.csファイルでc#クラスを使用できないのはなぜですか?

分類Dev

ランダムな値を与える「指定された初期化子」を使用してCユニオンを初期化するのはなぜですか?

分類Dev

式でnull許容値を使用するときにC#で括弧が必要なのはなぜですか?

分類Dev

式でnull許容値を使用するときにC#で括弧が必要なのはなぜですか?

分類Dev

式でnull許容値を使用するときにC#で括弧が必要なのはなぜですか?

分類Dev

C#コンストラクターが型を推測できないのはなぜですか?

分類Dev

サイズを指定せずに、C ++のクラス内に初期化子を使用して配列を宣言するにはどうすればよいですか?

分類Dev

ClangがC ++で指定された初期化子を許可することにしたのはなぜですか?

分類Dev

c ++ 11でautoによる直接リスト初期化が許可されないのはなぜですか

分類Dev

自動実装されたプロパティのみがC#で初期化子を持つことができるのはなぜですか?

Related 関連記事

  1. 1

    マクロでC ++ 11ブレースの初期化を使用できないのはなぜですか?

  2. 2

    C:中括弧で配列内の構造体を初期化できないのはなぜですか?

  3. 3

    C#で中括弧なしでスイッチセクション内でusing変数を使用できないのはなぜですか?

  4. 4

    std :: vectorの文字列リテラル初期化子リストでC ++でstd :: vector <std :: string>を作成できないのはなぜですか?

  5. 5

    C ++ 11がC99として指定された初期化子リストをサポートしないのはなぜですか?

  6. 6

    親の初期化が機能するのに、コンストラクタ初期化リストのC ++ 11中括弧の初期化が機能しないのはなぜですか?

  7. 7

    C ++で、初期化子リストで基本クラスのテンプレート引数を繰り返す必要があるのはなぜですか?

  8. 8

    C ++ 11 / C ++ 14の自動およびブレース付き初期化子に特別な型推定規則があるのはなぜですか?

  9. 9

    なぜC ++は、派生クラスが初期化リストで基本クラスのメンバーを使用することを許可しないのですか?

  10. 10

    C ++ 20が順不同の指定初期化子をサポートしないのはなぜですか?

  11. 11

    C ++ 11中括弧の初期化構文を使用して、単純な集計の簡単なコンストラクターを宣言しないようにすることはできますか?

  12. 12

    Cでは、const変数を配列サイズの初期化子として使用できないのはなぜですか?

  13. 13

    C ++ :(重複していない)クラス内で初期化された(宣言されただけではない)統合静的メンバーがリンカーエラーを引き起こすのはなぜですか?

  14. 14

    C ++ 11でconst関数を使用してクラスを変更できるのはなぜですか?

  15. 15

    C ++:「配列初期化子は初期化子リストまたは文字列リテラルでなければなりません」というエラーが発生するのはなぜですか?

  16. 16

    次のメンバー初期化子がC ++で機能しないのはなぜですか

  17. 17

    指定された初期化子がC ++で機能するのはなぜですか?

  18. 18

    可変個引数関数がC ++ 11のリスト初期化引数を「食べる」ことができないのはなぜですか?

  19. 19

    C ++ 11でオブジェクトを初期化するために、括弧()と初期化子{}構文をいつ使用する必要がありますか?

  20. 20

    aspx.csファイルでc#クラスを使用できないのはなぜですか?

  21. 21

    ランダムな値を与える「指定された初期化子」を使用してCユニオンを初期化するのはなぜですか?

  22. 22

    式でnull許容値を使用するときにC#で括弧が必要なのはなぜですか?

  23. 23

    式でnull許容値を使用するときにC#で括弧が必要なのはなぜですか?

  24. 24

    式でnull許容値を使用するときにC#で括弧が必要なのはなぜですか?

  25. 25

    C#コンストラクターが型を推測できないのはなぜですか?

  26. 26

    サイズを指定せずに、C ++のクラス内に初期化子を使用して配列を宣言するにはどうすればよいですか?

  27. 27

    ClangがC ++で指定された初期化子を許可することにしたのはなぜですか?

  28. 28

    c ++ 11でautoによる直接リスト初期化が許可されないのはなぜですか

  29. 29

    自動実装されたプロパティのみがC#で初期化子を持つことができるのはなぜですか?

ホットタグ

アーカイブ