Попались мне 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;
}




