Я знаю, что есть темы, похожие на это уже (например, this).Поскольку строковый литерал считается lvalue, почему ссылка привязки lvalue будет const?
Пример, приведенный в этой теме был такой:
std::string & rs1 = std::string();
Очевидно, что станд :: строка() является Rvalue. Однако мой вопрос в том, почему s1 является законным, а s2 - нет?
const std::string& s1 = "String literal";
std::string& s2 = "String literal";
Стандарт четко гласит, что строковые литералы являются lvalues (что вполне понятно, так как они являются технически Const символ * за кадром). Когда я компилирую s2, хотя, я получаю следующее:
prog.cpp:4:19: error: invalid initialization of non-const reference of type
'std::string& {aka std::basic_string<char>&}' from an rvalue of type
'const char*' std::string& s2 = "String literal";
Я понимаю, что стандартное определение lvalues и rvalues являются взаимоисключающими, так это потенциально ошибка с компилятором? Я использую gcc 4.9.2 в этом примере. Будет ли это также одним из случаев, когда букваль действительно является значением xvalue?
Поскольку ссылки не константы lvalue не могут привязываться к временным. const lvalues ссылки могут. Временной объект типа string создается из «const char *». Это связано с ссылкой. – bolov
Вы уверены, что ваш пример кода - это то, что вы скомпилировали? 'const std :: string & s2 =" String literal "' является полностью допустимым, тогда как, очевидно, 'std :: string & s1 =" String literal "' is not. – mbgda
Отредактировано. Спасибо за быстрый ответ. Я просто понял, что я скопировал/вставил неправильно. – elau