Это очень минимальный пример:
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)
Я нашел три метода обхода:
- Избегайте использования встроенной переменной temp для вызова ProcessFoo.
Вот так:
Foo foo42(42);
ProcessFoo(foo42);
-
ProcessFoo принимает ссылку на const:
void ProcessFoo(const Foo& foo)
-
ProcessFoo просто позволяет Foo пройти по значению.
void ProcessFoo(Foo foo)
Почему компилятор запрещает мой исходный код? (О чем это защищает)? Что касается каждого из трех обходных решений, которые удовлетворяют компилятору? Что бы MSVC разрешил, но не g++?