大括号括起来的初始化列表中的左值引用初始化无法编译
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 就好了。
我的程序很简单:
#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 就好了。