Инициализация ссылки 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

На самом деле приведенный выше код представляет собой слегка измененный пример из «Языка программирования 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 инициализируется точно так же.


person Dmitry Frank    schedule 26.02.2015    source источник
comment
Чем он отличается от оригинального примера в книге?   -  person eerorika    schedule 26.02.2015
comment
gcc 4.6 довольно старый; обратите внимание, что у него все еще есть c++0x вместо c++11. Возможно, вы захотите попробовать более новую версию.   -  person Angew is no longer proud of SO    schedule 26.02.2015
comment
@ user2079303, я обновил свой вопрос.   -  person Dmitry Frank    schedule 26.02.2015
comment
@Angew, хорошо, я все еще использую то, что предлагает Linux Mint 13 LTS, у меня все еще нет времени беспокоиться об обновлении. Я постараюсь найти способ протестировать новую версию, спасибо.   -  person Dmitry Frank    schedule 26.02.2015


Ответы (1)


Похоже проблема с компилятором. gcc 4.6.3 довольно старый; обратите внимание, что он по-прежнему должен использовать c++0x вместо c++11. В более поздних версиях (в частности, 4.9.2) код компилируется и запускается просто отлично.

person Angew is no longer proud of SO    schedule 26.02.2015