我目前正试图理解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]
(更新 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]
很遗憾,我在标准草案中没有找到相关的部分。我的猜测是我对统一初始化的使用存在误解,因为Comeau显示了以下警告信息:
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
uniform_init_of_ref.cpp:3: error: ISO C++ forbids use of initializer list to initialize reference 'ref'
。 - rmflowx(xx)
,我认为没有必要使用新颖的统一格式:-) - Cheers and hth. - Alf