2

私はこれについて少し困惑しています。デフォルトのスタック割り当てオブジェクト構築が他の構造体のメンバー変数として許可されている場合、パラメータ化された構築はなぜですか? Most Vexing Parseはこれと関係がありますか? ideone で C++0X も試してみましたが、同じ結果が得られました。

struct foo{
    foo() {}
    foo(int i) {}
};

struct bar{
  foo obj;      // Allowed
  foo obj2(10); // Not Allowed
};

エラー: 数値定数の前に ',' または '...' が必要です

IdeOne デモ

4

3 に答える 3

5

Most Vexing Parseへのリンクでは、非メンバー変数(クラス/構造体のメンバーではない変数)のインスタンス化について説明しています。示した例は、構造体で宣言されているメンバー変数の例です。通常、コンストラクターでそれらを初期化します。

struct bar
{
    foo obj;
    foo obj2;
    bar() : obj2(10) {}
};

最も厄介な解析の問題は、次のような状況で発生します。

struct baz
{
    baz(int n) {}
};

void foo()
{
    baz meow(int());
}

リンクに記述されている「最も厄介な解析」の問題により、識別子meowはタイプの関数宣言であるように見えます。baz (int)(一見デフォルトのように見えるint()int -初期化は実際には単なるデータ型であることがわかります)

于 2012-10-24T22:02:38.057 に答える
1

書きます

struct bar {
  foo obj;
  foo obj2;
  foo(): obj2(10) {}
}

このように、インスタンス化するときbarobj2構築は10で行われます。

于 2012-10-24T22:01:29.360 に答える
1

static constC++11 より前は、宣言でメンバーが整数でない限り、メンバーを初期化できませんでした。

C++11 では、一様な初期化とクラス内メンバーの初期化を使用できます。

foo obj2{10};

コンストラクターは明示的ではないため、次のようにすることもできます。

foo obj2 = 10;

C++11 ではなく、コンストラクター リストでメンバー初期化子を使用する必要があります。

于 2012-10-24T22:04:27.443 に答える