Передача указателя на временный объект
Мы знаем, что можем передавать временные объекты в функции по константной ссылке, например так:
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{});
}