18

私は現在、C++0xの新しい統一初期化を理解しようとしています。残念ながら、参照の均一な初期化を使用することに困惑しました。例:

int main() {
   int a;
   int &ref{a};
}

この例は正常に機能します。

% LANG=C g++ uniform_init_of_ref.cpp -std=c++0x -o uni -Wall -Wextra
uniform_init_of_ref.cpp: In function `int main()':
uniform_init_of_ref.cpp:3:10: warning: unused variable `ref' [-Wunused-variable]

Update Comeauはその例でエラーをスローするので、gccもそれをコンパイルすべきではないかもしれません)

ここで、整数の代わりにカスタムデータ型を使用すると、機能しなくなります。

class Y
{};

int main()
{
    Y y;
    Y &ref{y};
}

% LANG=C g++ initialization.cpp -std=c++0x -o initialization -Wall -Wextra
initialization.cpp: In function `int main()':
initialization.cpp:9:13: error: invalid initialization of non-const reference of type `Y&' from an rvalue of type `<brace-enclosed initializer list>'
initialization.cpp:9:8: warning: unused variable `ref' [-Wunused-variable]

残念ながら、標準ドラフトで関連するセクションが見つかりませんでした。コモーがこのメッセージで不平を言っているので、私は均一な初期化の使用法を誤解していると思います:

ComeauTest.c(9): error: reference variable "ref" requires an initializer
      Y &ref{y};

それで、あなたの誰かが私を正しい方向に向けることができますか?


この質問が関連する理由と、私が単に使用しない理由を知りたい場合Y &ref(y):コンストラクターの初期化リストで均一な初期化を使用できるようにしたいと思います:

class X { };

class Y {
    const X& x;

    public:
        Y (const X& xx):
            x{xx}
        {}
};

int main () {
    X x;
    Y y{x};
}

これは失敗し、上記と同じエラーメッセージが表示されます。

ノート:

  • LANG=C英語のエラーメッセージを有効にするために使用しています。
  • gccバージョン:4.6.1
4

1 に答える 1

6

N2672によると、8.5.4.4項は次のように述べているはずです。

それ以外の場合、Tが参照型の場合、Tによって参照される型の一時的な右辺値はリストで初期化され、参照はその一時的なものにバインドされます。[注:通常どおり、参照型が非const型への左辺値参照である場合、バインディングは失敗し、プログラムは不正な形式になります。]

これは(私が正しく理解していれば)参照の均一な初期化がそれらを新しい匿名インスタンスにバインドすることを意味するので、私にはそれはかなり役に立たないようです。それでも、一方が機能し、もう一方が機能しない理由は説明されていません。それらは同じように動作する必要があります(Y明示的なコンストラクターがない限り)。

于 2011-07-01T11:51:27.430 に答える