temporary object: А почему так не работает? в избранное  новое горячее всё    подписка   модер. 
От: Аноним 378 
Дата: 24.05.08 13:52
почему так не работает?

struct Foo {};

Foo get_foo() { return Foo(); }

void f(Foo&) {}

void g()
{
        f(get_foo());
}


ну получит f ссылку на временный объект,
что в этом страшного?
Re: temporary object: А почему так не работает? в избранное  новое    модер. 
От: Erop 
Дата: 24.05.08 13:59
Здравствуйте, Аноним, Вы писали:


А>ну получит f ссылку на временный объект,

А>что в этом страшного?

По стандарту. неконстантная ссылка -- это всегда lvalue. Ещё и указатель на этот временный объект получить прямо нельзя.
В новом стандарте будут ещё и rvalue ссылки, там можно будет написать такой код...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: temporary object: А почему так не работает? в избранное  новое    модер. 
От: Roman Odaisky 
Дата: 24.05.08 14:27
Оценка:2 (1)
Здравствуйте, Аноним, Вы писали:

А>ну получит f ссылку на временный объект,

А>что в этом страшного?

Это запрещено, чтобы избежать вот таких проблем:
void increment(float& x)
{
    x += 0.5772156649;
}

double x = std::log(42.);
increment(x); // oops!
status=sent (delivered to file: /dev/null)
Re: temporary object: А почему так не работает? в избранное  новое    модер. 
От: Sashaka 
Дата: 24.05.08 21:46
Здравствуйте, Аноним, Вы писали:

А>почему так не работает?


А>
А>struct Foo {};

А>Foo get_foo() { return Foo(); }

А>void f(Foo&) {}

А>void g()
А>{
А>        f(get_foo());
А>}

А>


А>ну получит f ссылку на временный объект,

А>что в этом страшного?

объясните дураку почему так не работает, потому что у меня работает.
Re[2]: temporary object: А почему так не работает? в избранное  новое    модер. 
От: Erop 
Дата: 24.05.08 22:32
Здравствуйте, Sashaka, Вы писали:

S>объясните дураку почему так не работает, потому что у меня работает.

А так?
void foo( int& );
void bar()
{
    foo( 1 );
}
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: temporary object: А почему так не работает? в избранное  новое    модер. 
От: VoidEx 
Дата: 25.05.08 00:46
Здравствуйте, Sashaka, Вы писали:

S>объясните дураку почему так не работает, потому что у меня работает.

Потому что MSVC
Re[3]: temporary object: А почему так не работает? в избранное  новое    модер. 
От: Sashaka 
Дата: 25.05.08 04:49
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Sashaka, Вы писали:


S>>объясните дураку почему так не работает, потому что у меня работает.

E>А так?
void foo( int& );
E>void bar()
E>{
E>    foo( 1 );
E>}


так не работает =) кстати не работает если Foo в исходном примере заменить на int, например, видимо MSVC :no: .
Re[2]: temporary object: А почему так не работает? в избранное  новое    модер. 
От: Sergey Chadov 
Дата: 25.05.08 09:07
Здравствуйте, Sashaka, Вы писали:


S>объясните дураку почему так не работает, потому что у меня работает.


/Za ?
или хотя бы /W4
--
Sergey Chadov

... << RSDN@Home 1.2.0 alpha rev. 685>>
Re: temporary object: А почему так не работает? в избранное  новое    модер. 
От: Maxim S. Shatskih mvp 
Дата: 25.05.08 16:12
А>ну получит f ссылку на временный объект,
А>что в этом страшного?

Получит ссылку, положит в какой-нить контейнер, а объект потом разрушится.
Занимайтесь LoveCraftом, а не WarCraftом!
Re[2]: temporary object: А почему так не работает? в избранное  новое    модер. 
От: Erop 
Дата: 25.05.08 16:25
Здравствуйте, Maxim S. Shatskih, Вы писали:

MSS>Получит ссылку, положит в какой-нить контейнер, а объект потом разрушится.

А если ему автоматический объект подсунут?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: temporary object: А почему так не работает? в избранное  новое    модер. 
От: Maxim S. Shatskih mvp 
Дата: 26.05.08 00:08
MSS>>Получит ссылку, положит в какой-нить контейнер, а объект потом разрушится.
E>А если ему автоматический объект подсунут?

Гимор со временными объектами я проходил еще в 1993 году. Сейчас, после 15 лет опыта, я буду избегать любого кода, который может создать такой вот гимор. Временные объекты как правило есть зло, особенно злоупотребление ссылками в том контексте, где бывают временные объекты.
Занимайтесь LoveCraftом, а не WarCraftом!
Re[4]: temporary object: А почему так не работает? в избранное  новое    модер. 
От: Erop 
Дата: 26.05.08 04:08
Здравствуйте, Maxim S. Shatskih, Вы писали:

MSS>Гимор со временными объектами я проходил еще в 1993 году. Сейчас, после 15 лет опыта, я буду избегать любого кода, который может создать такой вот гимор. Временные объекты как правило есть зло, особенно злоупотребление ссылками в том контексте, где бывают временные объекты.


IMHO, это говорит о том, что нехорошо запоминать указатели на переданные по ссылкам объекты. От константности ссылки это, IMHO, не зависит.
Но реальным ключом к отсутствию гемора такого рода является вовсе и не формальные правила про ссылки и указатели, продуманная схема владения объектами в программе. Из кода всегда должно быть легко понять кто кем владеет и почему тот или иной объект не умрёт раньше времени...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: temporary object: А почему так не работает? в избранное  новое    модер. 
От: Vamp 
Дата: 27.05.08 15:36
Тут сверху все правильно объяснили. А вот так надо сделать, чтобы работало:
struct Foo {};

Foo get_foo() { return Foo(); }

void f(const Foo&) {}

void g()
{
        f(get_foo());
}
Да здравствует мыло душистое и веревка пушистая.
Re[5]: temporary object: А почему так не работает? в избранное  новое    модер. 
От: Maxim S. Shatskih mvp 
Дата: 27.05.08 22:44
E>IMHO, это говорит о том, что нехорошо запоминать указатели на переданные по ссылкам объекты. От константности ссылки это, IMHO, не зависит.

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

Это разные парадигмы. Работа с объектом _только через указатели_ — это парадигма ОО классики типа Смоллтока, Явы, Шарпа

Временные же объекты не имеют к этой парадигме отношения, зато имеют к передаче объектов _по значению_ везде. Это не ОО, это ADT — абстрактные типы данных.

Сюда же и ссылки, которые предназначены главным образом для параметров и возвращаемых значений, и не имеют практически никакой ценности вне этого, являясь недоуказателями.

Это все ADT. И функции operator тоже ADT. Вторая парадигма языка, к ОО не относится. Да, Си++ мультипарадигмальный язык, темплейты вдобавок еще и третья парадигма.

Чтобы не было гимора, надо чувствовать, в какой парадигме пишешь.
Занимайтесь LoveCraftом, а не WarCraftом!
Re[2]: temporary object: А почему так не работает? в избранное  новое    модер. 
От: alexsy 
Дата: 28.05.08 08:48
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Аноним, Вы писали:



А>>ну получит f ссылку на временный объект,

А>>что в этом страшного?

E>По стандарту. неконстантная ссылка -- это всегда lvalue. Ещё и указатель на этот временный объект получить прямо нельзя.

E>В новом стандарте будут ещё и rvalue ссылки, там можно будет написать такой код...

А на lvalue получить указатель или ссылку нельзя !! по тому что это регистор процессора EAX или если по Жизни везёт то RAX..
или какой другой в зависимости от архитектуры
Re[3]: temporary object: А почему так не работает? в избранное  новое    модер. 
От: Erop 
Дата: 28.05.08 08:58
Здравствуйте, alexsy, Вы писали:

A>А на lvalue получить указатель или ссылку нельзя !! по тому что это регистор процессора EAX или если по Жизни везёт то RAX..

A>или какой другой в зависимости от архитектуры

Ну и что? Читай про &&
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском