Передача указателя на временный объект

Мы знаем, что можем передавать временные объекты в функции по константной ссылке, например так:

class A
{
public:
    A(int _b = 0) 
    {
        b = _b;
    }

    int b;
};

void foo(A& a) {printf("%d", a.b);}
void cfoo(const A& a) {printf("%d", a.b);}

int main(void)
{
    //foo(A(4)); doesn't compile
    cfoo(A(5));
}

а как насчет передачи по указателю? почему это компилируется?

void pfoo(A* pa) {pa->b = 19;}

int main(void)
{
    pfoo(&A(5));
}

1 ответ

а как насчет передачи указателя анонимных переменных? почему это компилируется?

Вы, вероятно, используете компилятор, который не соответствует стандарту C++.

Адрес (значение) объекта r-значения не может быть получен. Это не должно компилироваться.


Тем не мение, operator& может быть перегружен, так что он может быть вызван для временного объекта, например:

struct A
{
    A* operator&() { return this; }
};

В C++11 временный объект может быть связан со ссылкой на r-значение. После этого ссылка на r-значение ведет себя как l-значение и, следовательно, может быть получен адрес временного объекта:

struct A {};

void foo(A*);

void foo(A&& a) { foo(&a); }

int main() {
    foo(A{});
}
Другие вопросы по тегам