私は現在、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
gcc 4.4.1最初の例をコンパイルしません: 'uniform_init_of_ref.cpp:3:error:ISO C++はイニシャライザリストの使用を禁止して参照を開始します ce 'ref'' – rmflow
@rmflow:gcc4.4は完全にはありません均一な初期化を実装する。 –
普通の 'x(xx)'をコンストラクタのイニシャライザリストで使うことができます。私はその新しく揃ったユニフォームを必要としません:-) –