У меня очень простая программа:
#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
На самом деле приведенный выше код представляет собой слегка измененный пример из «Языка программирования C++», 2013 г., Страуструп, раздел 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
инициализируется точно так же.
c++0x
вместоc++11
. Возможно, вы захотите попробовать более новую версию. - person Angew is no longer proud of SO   schedule 26.02.2015