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

时间:2015-02-26 15:45:18

标签: c++ reference lvalue

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

  #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的第13.2.2节“C ++编程语言”中的一个稍微修改过的例子,我认为没有理由不这样做。我错过了什么吗?

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也以完全相同的方式初始化。

1 个答案:

答案 0 :(得分:3)

似乎是编译器的问题。 gcc 4.6.3很老了;请注意,它仍然必须使用c++0x而不是c++11。使用更新的版本(特别是4.9.2),代码compiles and runs就好了。