大括号括起来的初始化列表中的左值引用初始化无法编译

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

实际上,上面的代码是 "The C++ Programming Language" 中 Stroustrup 2013 年第 7.7.2 节中的一个稍微修改过的示例,我认为它没有理由不起作用。我错过了什么吗?

更新: 这是书中的原始示例:

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 很旧;请注意,它仍然必须使用 c++0x 而不是 c++11。对于更新的版本(特别是 4.9.2),代码 compiles and runs 就好了。