Невозможно передать временный объект в качестве ссылки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

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