私は現在、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