Невозможно передать временный объект в качестве ссылкиC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Невозможно передать временный объект в качестве ссылки

Сообщение Anonymous »

Это очень минимальный пример:

Код: Выделить всё

class Foo
{
public:
Foo(int x) {};
};

void ProcessFoo(Foo& foo)
{
}

int main()
{
ProcessFoo(Foo(42));
return 0;
}
Приведенное выше компилируется нормально в Visual Studio, но генерирует ошибку в Linux и Mac.
При компиляции вышеприведенного кода возникает следующее:

Код: Выделить всё

$ g++ -std=c++11 -c newfile.cpp

newfile.cpp: In function ‘int main()’:
newfile.cpp:23:23: error: invalid initialization of non-const reference of type ‘Foo&’ from an rvalue of type ‘Foo’
ProcessFoo(Foo(42));
^
newfile.cpp:14:6: note: in passing argument 1 of ‘void ProcessFoo(Foo&)’
void ProcessFoo(Foo& foo)
Я нашел три обходных пути:
  • Создайте временную переменную для вызова ProcessFoo.
Вот так:

Код: Выделить всё

Foo foo42(42);
ProcessFoo(foo42);
  • ProcessFoo принимает константную ссылку: void ProcessFoo(const Foo& foo)
  • ProcessFoo просто позволяет Foo передаваться по значению. void ProcessFoo(Foo foo)
Почему компилятор запрещает мой исходный код? (От чего он защищает)? Что такого в каждом из трех описанных выше обходных путей, что удовлетворяет компилятор? Что бы это позволило MSVC, кроме g++?

Подробнее здесь: https://stackoverflow.com/questions/274 ... -reference
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»