Мы знаем, что мы можем передавать временные объекты в функции с помощью ссылки const, например:
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));
}
но как насчет передачи указателей анонимных переменных? почему это компилируется?
Вероятно, вы используете компилятор, который не соблюдает стандарт C++.
Нет адреса объекта r-значения (временного). Это не должно компилироваться.
Однако operator&
может быть перегружен, поэтому его можно вызвать на временном объекте, например:
struct A
{
A* operator&() { return this; }
};
В C++ 11 временный объект может быть привязан к ссылке r-значения. После этого ссылка r-value ведет себя как l-значение и, следовательно, адрес временного объекта может быть взят:
struct A {};
void foo(A*);
void foo(A&& a) { foo(&a); }
int main() {
foo(A{});
}
foo(A(5))
не скомпилируется, потому что параметр decl является неконстантной ссылкой, и поэтому не может быть предоставлен как временный . Отправка временного адреса должна как минимум предупредить вас, что вы ошиблись. Если это не так, вам нужно включить предупреждения вашего компилятора или удалить этот компилятор и получить тот, который предупредит вас о такой отвратительности.