Попались мне win32-исходники, надо портировать под линукс. Кроме прочего попалось мне сообщение об ошибке такого вида:
test_conv.cpp: In function ‘int main(int, char**)’:
test_conv.cpp:52:25: error: no matching function for call to ‘B::setData1(A)’
test_conv.cpp:52:25: note: candidate is:
test_conv.cpp:28:14: note: void B::setData1(A&)
test_conv.cpp:28:14: note: no known conversion for argument 1 from ‘A’ to ‘A&’
В инете не нашёл ответа. Ну, обход был очевиден: избавиться от ссылки. Тогда анонимный объект копироваться не будет (как проверить наверняка?), а вот неанонимный объект будет.
Или второй вариант: если доступ осуществляется только к параметрам класса, а не методам, то можно объявить конст ссылку.
Универсальным способом могла бы быть перегрузка: объект объявлен - автоматом выбирай по ссылке, объект анонимный - тогда без ссылки, он всё равно в месте вызова не может быть больше использован... или хм, может?.. Полюбому, перегрузка не работает. Как же тогда?
Вот мой минимальный пример:
class A {
int data_;
public:
A() {};
~A() {};
int data() {return data_;};
};
class B {
int data_;
public:
B() {};
~B() {};
void setData1(A& a) {
data_ = a.data();
};
// error: no known conversion for argument 1 from ‘A’ to ‘A&’
//void setData1(A a) {
// data_ = a.data();
//};
// error: call of overloaded ‘setData1(A&)’ is ambiguous
//void setData1(const A& a) {
// data_ = a.data();
//}
// error: passing ‘const A’ as ‘this’ argument of ‘int A::data()’ discards qualifiers
// ???
};
int main(int argc, char *argv[])
{
A a;
B b;
b.setData1( a ); // OK
b.setData1( A() ); // error
return 0;
}