从大括号括起来的初始值设定项列表进行的Lvalue引用初始化无法编译
Lvalue reference initialization from brace-enclosed initializer list fails to compile
我有一个非常简单的程序:
#include <iostream>
using namespace std;
int main()
{
string var {"test"};
string &lr {var};
cout << var << "n";
cout << lr << "n";
}
编译如下:
g++ ./test.cpp -g3 -std=c++0x
./test.cpp: In function ‘int main()’:
./test.cpp:9:19: error: invalid initialization of non-const reference of type ‘std::string& {aka std::basic_string<char>&}’ from an rvalue of type ‘<brace-enclosed initializer list>’
但如果我将lr
的初始化更改为string &lr = var;
,它就会编译并工作。
g++版本为4.6.3
事实上,上面的代码是Stroustrup 2013年的"C++编程语言"第7.7.2节中的一个稍微修改过的例子,我认为它没有理由不起作用。我错过什么了吗?
UPD:这是本书中的原始示例:
string var {"Cambridge"};
string f();
string& r1 {var}; // lvalue reference, bind r1 to var (an lvalue)
string& r2 {f()}; // lvalue reference, error : f() is an rvalue
string& r3 {"Princeton"}; // lvalue reference, error : cannot bind to temporary
因此,线string& r1 {var};
完全对应于矿string &lr {var};
,并且源string
以完全相同的方式初始化。
编译器似乎有问题。gcc 4.6.3相当古老;注意它仍然必须使用CCD_ 6而不是CCD_。对于更新的版本(特别是4.9.2),代码编译和运行都很好。
相关文章:
- 对RValue对象调用的LValue ref限定成员函数
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- 为什么不能使用 rvalue 来初始化 lvalue 引用
- 每当传递lvalue时,每当通过rvalue传递时,将const引用存储
- C 〜引用非const的初始值必须是lvalue
- 为什么const/nonconst lvalue引用与rvalue参考结合
- rvalue引用lVALUE参考-UB
- 返回const lvalue引用rvalue临时?为什么这项工作
- 从大括号括起来的初始值设定项列表进行的Lvalue引用初始化无法编译
- 使用 LValue 引用移动语义
- 可以在分配它的对象被销毁后访问返回的 LValue 引用
- Lvalue引用绑定
- 为什么Rvalue不能绑定Lvalue引用
- 将一个数组中的引用分配给另一个数组 - "warning: target of assignment not really an lvalue"
- 引用(类型 &)"non-const lvalue reference to type cannot bind"错误,但指针(类型 *)不错误