从大括号括起来的初始值设定项列表进行的Lvalue引用初始化无法编译

Lvalue reference initialization from brace-enclosed initializer list fails to compile

本文关键字:Lvalue 引用 初始化 列表 编译 起来      更新时间:2023-10-16

我有一个非常简单的程序:

  #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),代码编译和运行都很好。