我目前正試圖理解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:錯誤:ISO C++禁止使用初始化列表來初始化引用 ce'ref'' – rmflow
@rmflow:gcc4.4沒有完全實現統一初始化。 –
您可以使用普通的'X(XX)'在構造函數初始化列表,就我看不出有什麼需要一種新奇的東西統一:-) –