2016-03-20 3 views
3

Почему первая строка не компилируется во время компиляции второй строки?C++ - Конструктор типа класса возвращает значение lvalue?

float& t = float(10); // initial value of reference to non - const must be an lvalue 
string& w = string("gg"); 

Означает ли это, что конструктор строк возвращает значение lvalue?

+0

g ++ 4.8.2 дает «ошибку: недействительная инициализация неконстантной ссылки типа ...» для * каждого * этих строк. –

+0

Это хороший вопрос, который заставляет меня задаться вопросом, почему здесь всегда кто-то голосует/голосует здесь (и даже не оставляя комментариев, объясняя почему). Некоторые пользователи здесь должны быть по праву лишены этой привилегии. –

+1

Я предполагаю, что вторая строка компилируется, потому что вы используете MSVC, и вы не компилировались с/W4. Если вы скомпилировали/W4, вы должны были увидеть что-то вроде «предупреждения C4239: нестандартное расширение». – cpplearner

ответ

3

Конструктор по определению не имеет возвращаемого значения. То, что вы пытаетесь выполнить, ссылается на временное значение, которое не разрешено.

Хорошая статья для понимания как lvalue, так и rvalue ссылок: C++ Rvalue References Explained.

+0

«То, что вы пытаетесь выполнить, ссылается на временное значение, которое не разрешено». Да, я согласен с этим утверждением. Я был просто смущен, почему вторая строка компилируется. cpplearner прав. Я использую MSVC. Возможно, у MSVC есть особые свойства? – Eugene

+0

Это странно, потому что я получаю ту же ошибку в обоих случаях с gcc и clang: 'невозможно инициализировать неконстантную ссылку из rvalue'. – karastojko

2

Что вы получаете не то, что вы ожидаете:

float& ref = float(10); 

Что случается здесь? float(10) создает временный поплавок (не привязанный ни к чему), поэтому rvalue. Поэтому вы не можете привязать его к ссылке, не связанной с константой.

float const & cref = float(10); // OK! 

Механика, участвующие в этом одинаковы для std::string. Я озадачен тем, что вы не получаете ошибку компилятора в примере строки (я делаю это с gcc 5.3.0)

Обратите внимание, что это не имеет ничего общего с так называемым «возвращаемым значением конструктора», поскольку конструкторы не имеют такая вещь.

+0

Спасибо за ваш ответ. Я думаю, это потому, что я использую MSVC. – Eugene

Смежные вопросы