【发布时间】:2012-05-17 14:03:03
【问题描述】:
也就是说,为什么会这样:
struct S {};
struct T
{
T(S& s) : s{s} {}
S& s;
};
int main()
{
S s;
T t{s};
}
给我一个 GCC 4.7 的编译器错误:
test.cpp: In constructor 'T::T(S&)':
test.cpp:5:18: error: invalid initialization of non-const reference of type 'S&' from an rvalue of type '<brace-enclosed initializer list>'
?
要修复错误,我必须将s{s} 更改为s(s)。这不会破坏统一初始化的,呃,uniformity?
编辑:我尝试了 clang,并且 clang 接受了它,所以也许这是一个 GCC 错误?
【问题讨论】:
-
在问 C++11 问题时,我会包括编译器和版本以防万一。并非所有编译器都支持所有功能,如果发现怪癖我不会感到惊讶
-
@DavidRodríguez-dribeas:好点,在编译器版本中添加
-
您无法从值引用(初始化列表)初始化命名引用。如果您需要 c++ 标准,我可以为您指出 pdf 和页码。另外,需要注意的是,您的参考对象,也就是 &S,仅在赋值的右侧进行。不,它不会破坏统一初始化的统一性,初始化列表总是变量名(初始化)和逗号分隔。最后一个可验证的,没有逗号
-
@johnathon:我真的想要那个参考,因为我知道你可以做到。我添加了一个我认为合适的引号的答案。
-
@DavidRodríguez-dribeas 第 273 页.. 继续阅读。
标签: c++ reference c++11 initializer-list uniform-initialization