Мы знаем, что можем передавать временные объекты функциям по константной ссылке, например:
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));
}
foo(A(5))
не может быть скомпилирован, потому что параметр decl является неконстантной ссылкой, и поэтому ему нельзя передать временную. Отправка адреса временного должна, по крайней мере, предупредить вас о том, что вы ошибались. Если этого не произошло, вам нужно запустить предупреждения компилятора или выбросить этот компилятор и получить тот, который предупредит вас о такой ужасности. - person WhozCraig   schedule 18.09.2014error: taking address of temporary
. Хотя может быть принудительно скомпилирован с-fpermissive
и адрес даст ответ. - person alfC   schedule 18.09.2014&A(5)
- это ошибка, это не указатель на переменную, созданную в стеке. Rvalue не может получить свой адрес. - person M.M   schedule 18.09.2014