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

0

Мы знаем, что мы можем передавать временные объекты в функции с помощью ссылки 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));
}
  • 1
    Вы просто передаете указатель на переменную, созданную в стеке. Это просто адрес в памяти, который работает, пока эта память действительна. Я не совсем уверен, в чем проблема здесь. Как вы думаете, почему ссылка должна работать, а не указатель?
  • 2
    Можете ли вы изменить слова «анонимной переменной» к «временным». Думайте об этом как о способе (а) сэкономить на наборе текста и (б) точно описать фактическое состояние данных, на которые распространяются данные). И foo(A(5)) не скомпилируется, потому что параметр decl является неконстантной ссылкой, и поэтому не может быть предоставлен как временный . Отправка временного адреса должна как минимум предупредить вас, что вы ошиблись. Если это не так, вам нужно включить предупреждения вашего компилятора или удалить этот компилятор и получить тот, который предупредит вас о такой отвратительности.
Показать ещё 5 комментариев
Теги:
pointers
temporary-objects

1 ответ

3

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

Вероятно, вы используете компилятор, который не соблюдает стандарт 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{});
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню