LINUX.ORG.RU

C++ указатель на временный объект


0

0

Хмм часто вижу в винде такой код:

GetDupaFromDupa(&variant_t())

&variant_t() как я понимаю равен vtMissing, то есть у класса variant_t есть оператор cast к variant_t*?

Или так просто вообще в C++ можно? Потому что с референциями нелзя, например так:

void GetDupaFromDupa(Smth &t)

GetDupaFromDupa(Smth())

будет типо работать неправильно, надо

void GetDupaFromDupa(const Smth &t)

GetDupaFromDupa(Smth())

А почему с указателями такая фигня проходит?

> void GetDupaFromDupa(Smth &t)

> GetDupaFromDupa(Smth())

> будет типо работать неправильно, надо

> void GetDupaFromDupa(const Smth &t)

> GetDupaFromDupa(Smth())

Работать будет правильно, но это может оказаться не тем, что тебе нужно :)

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

А разве эти временные объекты живы всю дорогу вызова GetDupaFromDupa()? Они же передаются через значение. То есть &variant_t() должно ж сдохнуть прежде чем начнется выполнение тела функции?

dissident ★★
() автор топика

> void GetDupaFromDupa(Smth &t)
> GetDupaFromDupa(Smth())
> будет типо работать неправильно

По-моему правильно будет работать, временные объекты живут до конца работы функции. Хотя может и вру.

Legioner ★★★★★
()
Ответ на: комментарий от tailgunner

> Где? Твои примеры - ссылка и указатель.
Указатель передается через значение. То есть ему по барабану что с объектом будет происходить. Разве временные объекты не уничтожаются во время вызова функции? То есть копируются (при этом вызывается деструктор).

dissident ★★
() автор топика
Ответ на: комментарий от dissident

> Разве временные объекты не уничтожаются во время вызова функции?

вроде он должен жить до завершения вычисления полного выражения:

persists until the completion of the full expression containing the call

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

Там чем же плохо

wtf(smth())

при void wtf(smth &s)

Что-то очень смутно вспоминается из Трупа, но никак не может вспомниться. :-\

dissident ★★
() автор топика
Ответ на: комментарий от dissident

Это плохо тем, что _часто_ это не то, что ты имеешь в виду (какой вообще смысл изменять временный объект). Но так делать можно.

tailgunner ★★★★★
()
Ответ на: комментарий от dissident

> Там чем же плохо wtf(smth()) при void wtf(smth &s)

тем что wtf принимает неконстантную ссылку. Если поставить конст, то все будет соответствовать стандарту. Временный объект будет жить до завершения полного выражения.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

> тем что wtf принимает неконстантную ссылку. Если поставить конст, то
> все будет соответствовать стандарту.
А почему конкретно это плохо?

dissident ★★
() автор топика
Ответ на: комментарий от dissident

>А почему конкретно это плохо?

Семантический смысл теряется. Параметр, который является неконстантной ссылкой подразумевает возврат какого-то значения (изменение этого параметра), что является бессмысленным для временных объектов.

Sectoid ★★★★★
()
Ответ на: комментарий от Sectoid

по моему это даже просто запрещено стандартом. Сейчас не могу место в стандарте найти, но g++ ругается что создается non-const reference на temporary

dilmah ★★★★★
()
Ответ на: комментарий от Sectoid

> Параметр, который является неконстантной ссылкой подразумевает возврат какого-то значения (изменение этого параметра), что является бессмысленным для временных объектов.

Вообще говоря, не является. Например, меня в данном конкретном случае совершенно не интересует значение, возвращаемое через данный конкретный out-параметр.

watashiwa_daredeska ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.