2011-07-01 9 views
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] 

更新コモーは、その例えば、エラーがスローされますので、多分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
+0

gcc 4.4.1最初の例をコンパイルしません: 'uniform_init_of_ref.cpp:3:error:ISO C++はイニシャライザリストの使用を禁止して参照を開始します ce 'ref'' – rmflow

+2

@rmflow:gcc4.4は完全にはありません均一な初期化を実装する。 –

+0

普通の 'x(xx)'をコンストラクタのイニシャライザリストで使うことができます。私はその新しく揃ったユニフォームを必要としません:-) –

答えて

6

N2672によると段落8.5.4.4は言う必要があります。

参照の均一な初期化を意味し、新規にそれらを結合し(私はそれを正しく理解している場合)

Otherwise, if T is a reference type, an rvalue temporary of the type referenced by T is list-initialized, and the reference is bound to that temporary. [ Note: As usual, the binding will fail and the program is ill-formed if the reference type is an lvalue reference to a non-const type. ]

匿名のインスタンスなので、私にとってはそれはかなり役に立たないようです。それはまだ、なぜ作品がどういうものなのかを説明するものではありません。 (Yにいくつかの明示的なコンストラクタがないかぎり)同じ振る舞いをする必要があります。

+0

最初の例では、 'ref = 42'を実行すると、' a'が変更されません**。 –

+0

@ alexandre-cは最初の例で 'ref'に代入すると' a'の値をここで変更します。 – evnu

+0

@evnu:この動作は@Janが引用するものに準拠していません。あなたはコモーに確認しましたか? –

関連する問題