我有一个非常简单的程序:
#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
也以完全相同的方式初始化。
答案 0 :(得分:3)
似乎是编译器的问题。 gcc 4.6.3很老了;请注意,它仍然必须使用c++0x
而不是c++11
。使用更新的版本(特别是4.9.2),代码compiles and runs就好了。