Re[3]: Не могу найти пример бага, который я не понял
От: so5team https://stiffstream.com
Дата: 25.10.24 04:29
Оценка: 41 (5) +5 :)
Здравствуйте, Marty, Вы писали:

M>>https://rsdn.org/forum/flame.comp/8834755?tree=tree
Автор: so5team
Дата: 19.10 11:01


M>Ага, оно. А в чем там косяк?


Если вы сохраняете в объекте ссылку, то ваша задача убедиться в том, что ссылка не протухнет за время жизни вашего объекта. А если вы сохраняете константную ссылку, то наступить на эти грабли проще простого:
struct Data {
  const int & _i;
  explicit Data(const int & i) : _i{i} {}
};

Data d{42}; // Упс! Приплыли.


Проблема в том, что 42 -- это временный экземпляр типа int, фактически это rvalue (или как оно там по стандарту правильно называется).
Но ссылка на rvalue в С++ неявным образом преобразуется к const-ссылке, поэтому в Data уходит константная ссылка на временный объект.

Соответственно, как только завершается выражение, в котором конструктор вызывался, временный объект перестает существовать, а ссылка на него протухает. В Data::_i оказывается повисшая ссылка, это баг.

Начиная с C++11 от этого можно попробовать защититься запретив конструктор, который принимает rvalue references. Что и было показано в том примере.

Но это же C++, здесь на каждую хитрую задницу тут же отыскивается болт с нужной резьбой. В данном случае это вариант шаблона функции std::min от двух аргументов. Этот вариант принимает аргументы по константной ссылке и возвращает так же константную ссылку. При этом если в std::min передать временные объекты, то std::min примет их по константной ссылке и точно так же вернет константную ссылку на один из временных объектов. Со вполне предсказуемым протуханием этой ссылки после завершения выражения, в котором std::min был вызван. Что и позволяет отдать в Data ссылку, которая протухнет сразу же после завершения работы конструктора.

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

А дальше вступают в дело особенности C++, в которых простые int-ы -- это не вполне себе объекты, а хз, особенно в режиме оптимизации, а в самом языке есть UB из-за которых мы вообще не знаем как поведет себя программа при срабатывании UB (в частности, при обращении по протухшей ссылке). Из-за чего протухшая ссылка на временный int при запуске программы может вести себя "вроде бы нормально": в данном случае мы видим вполне ожидаемую печать значения 42.

Но если скомпилировать данный код с санитайзерами, то санитайзер (по крайней мере в GCC) на эту проблему укажет.

Забавно, что вместо int-а мог бы быть какой-то "настоящий" тип, вроде std::string. Но мы все равно могли бы получить вполне ожидаемое поведение в простейших случаях вроде вот такого:
Data d{std::min("A"s, "B"s)};
std::cout << "min is: " << d._i << std::endl;

Тут бы сыграло наличие в std::string т.н. SSO, из-за чего маленькие строки не хранятся в динамической памяти и в d могла бы попасть ссылка на кусок стека, который бы все еще содержал нужное нам значение.

PS. Очень двойственные чувства были по мере написания этого пояснения. С одной стороны, делится знаниями обязательно надо, т.к. сам много чему учишься именно на том, чем делятся другие. Но, с другой стороны, досадно, что дядлы вроде Shmj потянут подобные объяснения в очередную GPT чтобы та натренировалась еще больше и приблизило конец нашей профессии в привычном нам виде.
Re[4]: Не могу найти пример бага, который я не понял
От: Alekzander  
Дата: 25.10.24 13:01
Оценка: +2 -1 :))) :))
Здравствуйте, so5team, Вы писали:

S>Если вы сохраняете в объекте ссылку, то ваша задача убедиться в том, что ссылка не протухнет за время жизни вашего объекта. А если вы сохраняете константную ссылку, то наступить на эти грабли проще простого:

S>
S>struct Data {
S>  const int & _i;
S>  explicit Data(const int & i) : _i{i} {}
S>};

S>Data d{42}; // Упс! Приплыли.
S>


О мой бог. Кто-нибудь ещё помнит, с чего вообще начинались ссылки и константность? С того, что они (конечно же, в отличие от ортодоксальных указателей!) делают мир БЕЗОПАСНЕЕ. Да я лучше отчекаю тысячу указателей в ручном режиме, чем буду искать одну вот такую заподлянку.

Говорить, что C++ это язык, где ты можешь отстрелить себе ногу — это большое упрощение. Судя по тому, что люди даже не задаются вопросом, как же мы пришли к такой "безопасности", C++ это язык, где ты трахнешь сам себя в задницу, и даже этого не заметишь.
I'm a sewer mutant, and my favorite authors are Edgar Allan Poo, H.G. Smells and George R.R. Martin.
Re[3]: Не могу найти пример бага, который я не понял
От: m2user  
Дата: 25.10.24 00:19
Оценка: :)))
M>Ага, оно. А в чем там косяк?

Не знаю. У меня C++ не родной основной язык разработки, поэтому в пример даже не вникал.
Не могу найти пример бага, который я не понял
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 24.10.24 20:30
Оценка: +1
Здравствуйте!

Недавно был пример какой-то — там автор приводил пример кривого класса, который в примере выводит то, что ожидалось (42 вроде), но баг таки есть. Я (да-да, тёмный человек) что-то не понял, в чем там баг, а спросить по месту не было возможности. Теперь тему потерял, но пробел в знаниях хочется заполнить. Может, автор вспомнит свой пост и разжуёт проблему?
Маньяк Робокряк колесит по городу
Re[3]: Не могу найти пример бага, который я не понял
От: Великий Реверс google
Дата: 25.10.24 00:46
Оценка: :)
Здравствуйте, Marty, Вы писали:

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


M>>https://rsdn.org/forum/flame.comp/8834755?tree=tree
Автор: so5team
Дата: 19.10 11:01


M>Ага, оно. А в чем там косяк?


нет там никакого бага
в С++ это по другом называется
но это отличный способ отсеивать шмыг и всяких робошмяков
Re[5]: Не могу найти пример бага, который я не понял
От: so5team https://stiffstream.com
Дата: 25.10.24 13:13
Оценка: +1
Здравствуйте, Alekzander, Вы писали:

A>Да я лучше отчекаю тысячу указателей в ручном режиме


Интересно как.
Re[6]: Не могу найти пример бага, который я не понял
От: Alekzander  
Дата: 25.10.24 21:14
Оценка: +1
Здравствуйте, Ip Man, Вы писали:

A>> C++ это язык, где ты трахнешь сам себя в задницу, и даже этого не заметишь.


IM>Можно писать аккуратно и всё будет ок. Баг занятный, но скорее как головоломка.


Речь же не об этом. Когда-то нормой была прямая работа с указателями (кстати, так тогда и рассуждали: "писать аккуратно и всё будет ок"). Потом добавили ссылки, затем константность, а ведь всё это дополнительный абстрактный слой, который имеет свою цену в виде усложнения (как и любая дополнительная абстракция). Для чего? Чтобы было безопаснее. Теперь оказывается, что есть тип багов, который возникает только благодаря этому всему. А за что боролись тогда?

То, что я первый и пока единственный об этом спросил, я и сформулировал как "и даже этого не заметишь".
I'm a sewer mutant, and my favorite authors are Edgar Allan Poo, H.G. Smells and George R.R. Martin.
Re[6]: Не могу найти пример бага, который я не понял
От: Alekzander  
Дата: 29.10.24 08:37
Оценка: :)
Здравствуйте, Marty, Вы писали:

A>>О мой бог. Кто-нибудь ещё помнит, с чего вообще начинались ссылки и константность? С того, что они (конечно же, в отличие от ортодоксальных указателей!) делают мир БЕЗОПАСНЕЕ. Да я лучше отчекаю тысячу указателей в ручном режиме, чем буду искать одну вот такую заподлянку.


M>Указатель тоже может указывать на временный объект


Да, в этом паскудном мире, сотканном из лжи, предательства и лицемерия, указатель может содержать невалидный адрес.

А ещё он прямо таки вопиет: я указатель и могу быть невалидным! Всё ли ты проверил? Совпадает ли время жизни?

Любые попытки снять эту проблему — ссылки, умные указатели — не должны создавать новые классы ошибок, связанные с валидностью адресов.

Что касается примеров, оно и видно, как ты в своё время читал MSDN и недавно закрывшийся CodeProject (мир его праху).
I'm a sewer mutant, and my favorite authors are Edgar Allan Poo, H.G. Smells and George R.R. Martin.
Re[9]: Не могу найти пример бага, который я не понял
От: so5team https://stiffstream.com
Дата: 29.10.24 08:58
Оценка: +1
Здравствуйте, Alekzander, Вы писали:

S>>Есть персонажи, которые считают, что их мнение единственно правильное, но когда с ними пытаешься общаться как со взрослыми людьми, они ведут себя как обиженные на весь мир и избалованные маленькие дети.


A>Поэтому я обычно и не общаюсь с C++ комьюнити


Обиженка говорит что не общается с C++ комьюнити в одном из чатов C++ комьюнити.
Re[8]: Не могу найти пример бага, который я не понял
От: Alekzander  
Дата: 29.10.24 13:17
Оценка: :)
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Я, за примерно тридцать лет активного пользования константными ссылками, ни разу не нарывался на обсуждаемую проблему. Мне действительно стоило все это время воздерживаться от использования ссылок?


Не знаю, тебе виднее. Я сам ими пользуюсь, раз уж это мейнстрим (везде, где это оправдано — т.е. не в сишных апях и тому подобных местах). Но ситуация, которую иллюстрирует этот пример, довольно упячная.
I'm a sewer mutant, and my favorite authors are Edgar Allan Poo, H.G. Smells and George R.R. Martin.
Re[5]: Не могу найти пример бага, который я не понял
От: qaz77  
Дата: 06.11.24 10:26
Оценка: +1
Здравствуйте, Igore, Вы писали:

I>1) Разве константная ссылка не продляет время жизни временного объекта


Продлевается только в одном scope:
{
   {
      const int &r = 42;
      // тут r жива  
   }
   // а тут уже нет
}


I>2) В данном примере почему 42 не попадает под .rodata, оптимизатор?


Значение инта компилятор может подставить инлайн в команду.
Все зависит от того, что с ссылкой делается.
Например, если берется адрес &r и используется, то компилятор должен какой-то адрес выдать, на стеке или в константных данных.

В случае с ссылкой-членом данных и конструктором в объекте неявно указатель будет храниться.
S>struct Data {
S>  const int & _i;
S>  explicit Data(const int & i) : _i{i} {}
S>};

Т.е. sizeof(Data) == sizeof(int*) и ничем особо протухшего указателя не отличается.
Re: Не могу найти пример бага, который я не понял
От: m2user  
Дата: 24.10.24 23:53
Оценка:
https://rsdn.org/forum/flame.comp/8834755?tree=tree
Автор: so5team
Дата: 19.10 11:01
Re[2]: Не могу найти пример бага, который я не понял
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 25.10.24 00:06
Оценка:
Здравствуйте, m2user, Вы писали:

M>https://rsdn.org/forum/flame.comp/8834755?tree=tree
Автор: so5team
Дата: 19.10 11:01


Ага, оно. А в чем там косяк?
Маньяк Робокряк колесит по городу
Re[4]: Не могу найти пример бага, который я не понял
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 25.10.24 09:41
Оценка:
Здравствуйте, so5team, Вы писали:

M>>>https://rsdn.org/forum/flame.comp/8834755?tree=tree
Автор: so5team
Дата: 19.10 11:01


M>>Ага, оно. А в чем там косяк?


S>Если вы сохраняете в объекте ссылку, то ваша задача убедиться в том, что ссылка не протухнет за время жизни вашего объекта. А если вы сохраняете константную ссылку, то наступить на эти грабли проще простого:


S>PS. Очень двойственные чувства были по мере написания этого пояснения. С одной стороны, делится знаниями обязательно надо, т.к. сам много чему учишься именно на том, чем делятся другие. Но, с другой стороны, досадно, что дядлы вроде Shmj потянут подобные объяснения в очередную GPT чтобы та натренировалась еще больше и приблизило конец нашей профессии в привычном нам виде.


Спасибо. Я просто что-то протупил, и не заметил, что там ссыллка в объекте
Маньяк Робокряк колесит по городу
Re[4]: Не могу найти пример бага, который я не понял
От: Skorodum Россия  
Дата: 25.10.24 11:45
Оценка:
Здравствуйте, so5team, Вы писали:

S>PS. Очень двойственные чувства были по мере написания этого пояснения. С одной стороны, делится знаниями обязательно надо, т.к. сам много чему учишься именно на том, чем делятся другие. Но, с другой стороны, досадно, что дядлы вроде Shmj потянут подобные объяснения в очередную GPT чтобы та натренировалась еще больше и приблизило конец нашей профессии в привычном нам виде.

Если делать это на русском, то это наступит позже

Я тут в другой теме
Автор: Skorodum
Дата: 25.10 12:30
вас с ЧатГПТ сравниваю
Re[5]: Не могу найти пример бага, который я не понял
От: Ip Man Китай  
Дата: 25.10.24 20:10
Оценка:
Здравствуйте, Alekzander, Вы писали:

A> C++ это язык, где ты трахнешь сам себя в задницу, и даже этого не заметишь.


Можно писать аккуратно и всё будет ок. Баг занятный, но скорее как головоломка.
Re[7]: Не могу найти пример бага, который я не понял
От: so5team https://stiffstream.com
Дата: 26.10.24 06:38
Оценка:
Здравствуйте, Alekzander, Вы писали:

A>Потом добавили ссылки, затем константность, а ведь всё это дополнительный абстрактный слой, который имеет свою цену в виде усложнения (как и любая дополнительная абстракция).


И большой у вас опыт программирования на C++ без ссылок и константности? Может вы даже помните в каком году это было?

A>Для чего? Чтобы было безопаснее.


Уверены? Особенно на счет ссылок?
Re[8]: Не могу найти пример бага, который я не понял
От: Alekzander  
Дата: 26.10.24 10:48
Оценка:
Здравствуйте, so5team, Вы писали:

S>И большой у вас опыт программирования на C++ без ссылок и константности? Может вы даже помните в каком году это было?


Вопросы о возрасте считаются неприличными. Но да, большой. На C++ я начал программировать в детстве, а сейчас я далеко не ребёнок.

A>>Для чего? Чтобы было безопаснее.


S>Уверены? Особенно на счет ссылок?


А зачем меня спрашивать? Тут же был недавно задан вопрос, чем ссылки отличаются от указателей — там всё и обсосали. И как (под каким соусом) продавали ссылки массовому программисту я тоже помню.
I'm a sewer mutant, and my favorite authors are Edgar Allan Poo, H.G. Smells and George R.R. Martin.
Re[9]: Не могу найти пример бага, который я не понял
От: so5team https://stiffstream.com
Дата: 26.10.24 12:47
Оценка:
Здравствуйте, Alekzander, Вы писали:

S>>И большой у вас опыт программирования на C++ без ссылок и константности? Может вы даже помните в каком году это было?


A>Вопросы о возрасте считаются неприличными. Но да, большой. На C++ я начал программировать в детстве, а сейчас я далеко не ребёнок.


А по уровню умственного развития и не скажешь. Тем не менее, когда вы успели попрограммировать на C++ без ссылок? Может быть еще до 1985-го года?

A>>>Для чего? Чтобы было безопаснее.


S>>Уверены? Особенно на счет ссылок?


A>А зачем меня спрашивать?


Ну так вы несете пургу, с вас и спрашиваю.

A>И как (под каким соусом) продавали ссылки массовому программисту я тоже помню.


И под каким же? Было ли там что-то про перегрузку операторов, конструкторы копирования?
Re[9]: Не могу найти пример бага, который я не понял
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 29.10.24 07:31
Оценка:
Здравствуйте, Alekzander, Вы писали:

S>>И большой у вас опыт программирования на C++ без ссылок и константности? Может вы даже помните в каком году это было?


A>Вопросы о возрасте считаются неприличными. Но да, большой. На C++ я начал программировать в детстве, а сейчас я далеко не ребёнок.


без ссылок и константности? Правда? Можно на твой код посмотреть?
Маньяк Робокряк колесит по городу
Re[5]: Не могу найти пример бага, который я не понял
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 29.10.24 07:32
Оценка:
Здравствуйте, Alekzander, Вы писали:

A>О мой бог. Кто-нибудь ещё помнит, с чего вообще начинались ссылки и константность? С того, что они (конечно же, в отличие от ортодоксальных указателей!) делают мир БЕЗОПАСНЕЕ. Да я лучше отчекаю тысячу указателей в ручном режиме, чем буду искать одну вот такую заподлянку.


Указатель тоже может указывать на временный объект
Маньяк Робокряк колесит по городу
Re[7]: Не могу найти пример бага, который я не понял
От: so5team https://stiffstream.com
Дата: 29.10.24 08:49
Оценка:
Здравствуйте, Alekzander, Вы писали:

M>>Указатель тоже может указывать на временный объект


A>Да, в этом паскудном мире, сотканном из лжи, предательства и лицемерия


Есть персонажи, которые считают, что их мнение единственно правильное, но когда с ними пытаешься общаться как со взрослыми людьми, они ведут себя как обиженные на весь мир и избалованные маленькие дети.
Re[8]: Не могу найти пример бага, который я не понял
От: Alekzander  
Дата: 29.10.24 08:51
Оценка:
Здравствуйте, so5team, Вы писали:

A>>Да, в этом паскудном мире, сотканном из лжи, предательства и лицемерия


S>Есть персонажи, которые считают, что их мнение единственно правильное, но когда с ними пытаешься общаться как со взрослыми людьми, они ведут себя как обиженные на весь мир и избалованные маленькие дети.


Поэтому я обычно и не общаюсь с C++ комьюнити
I'm a sewer mutant, and my favorite authors are Edgar Allan Poo, H.G. Smells and George R.R. Martin.
Re[10]: Не могу найти пример бага, который я не понял
От: Alekzander  
Дата: 29.10.24 09:01
Оценка:
Здравствуйте, so5team, Вы писали:

S>>>Есть персонажи, которые считают, что их мнение единственно правильное, но когда с ними пытаешься общаться как со взрослыми людьми, они ведут себя как обиженные на весь мир и избалованные маленькие дети.


A>>Поэтому я обычно и не общаюсь с C++ комьюнити


S>Обиженка говорит что не общается с C++ комьюнити в одном из чатов C++ комьюнити.


Ой вей.
I'm a sewer mutant, and my favorite authors are Edgar Allan Poo, H.G. Smells and George R.R. Martin.
Re[5]: Не могу найти пример бага, который я не понял
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 29.10.24 11:37
Оценка:
Здравствуйте, Alekzander, Вы писали:

A>с чего вообще начинались ссылки и константность? С того, что они (конечно же, в отличие от ортодоксальных указателей!) делают мир БЕЗОПАСНЕЕ.


Боюсь, никакая новая сущность не может сдвинуть мир в сторону безопасности по всем направлениям. По каким-то всегда возникнут другие опасности, этого не избежать.

A>я лучше отчекаю тысячу указателей в ручном режиме, чем буду искать одну вот такую заподлянку.


Эта "заподлянка" мало чем отличается от указателя на константный объект, который так же может и измениться, и стать недействительным в течение времени существования указателя. От указателей тоже откажетесь?
Re[6]: Не могу найти пример бага, который я не понял
От: Alekzander  
Дата: 29.10.24 11:42
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Эта "заподлянка" мало чем отличается от указателя


Указатель это указатель, а не абстракция адреса, которая пытается выглядеть как тип, но не гарантирует той же безопасности, что работа с типом. Другими словами, указатель является опасной штукой, но он и выглядит опасно, в отличие от.
I'm a sewer mutant, and my favorite authors are Edgar Allan Poo, H.G. Smells and George R.R. Martin.
Re[7]: Не могу найти пример бага, который я не понял
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 29.10.24 11:49
Оценка:
Здравствуйте, Alekzander, Вы писали:

A>указатель является опасной штукой, но он и выглядит опасно, в отличие от.


Что "выглядит опаснее" — автомобиль или самолет? А если сравнить по количеству травм/смертей на пассажиро-километр?

Я, за примерно тридцать лет активного пользования константными ссылками, ни разу не нарывался на обсуждаемую проблему. Мне действительно стоило все это время воздерживаться от использования ссылок?
Re[9]: Не могу найти пример бага, который я не понял
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 29.10.24 13:52
Оценка:
Здравствуйте, Alekzander, Вы писали:

A>Но ситуация, которую иллюстрирует этот пример, довольно упячная.


Думаю, если порыться в сборниках курьезов, то можно найти и менее очевидные засады, в том числе и с более часто применяемыми средствами языка. И что тогда делать с этими средствами?
Re[4]: Не могу найти пример бага, который я не понял
От: Кодт Россия  
Дата: 05.11.24 16:21
Оценка:
Здравствуйте, so5team, Вы писали:

S>Начиная с C++11 от этого можно попробовать защититься запретив конструктор, который принимает rvalue references. Что и было показано в том примере.


S>Но это же C++, здесь на каждую хитрую задницу тут же отыскивается болт с нужной резьбой. В данном случае это вариант шаблона функции std::min от двух аргументов. Этот вариант принимает аргументы по константной ссылке и возвращает так же константную ссылку. При этом если в std::min передать временные объекты, то std::min примет их по константной ссылке и точно так же вернет константную ссылку на один из временных объектов. Со вполне предсказуемым протуханием этой ссылки после завершения выражения, в котором std::min был вызван. Что и позволяет отдать в Data ссылку, которая протухнет сразу же после завершения работы конструктора.


Потому что в стандартной библиотеке есть недоделка.

Если определить min как
https://gcc.godbolt.org/z/xa3vrqGc6

template<class X, class Y>
decltype(auto)
mymin(X&& x, Y&& y)
requires(std::is_same_v<std::remove_cvref_t<X>, std::remove_cvref_t<Y>>)
{
    return (x < y) ? std::forward<X>(x) : std::forward<Y>(y);
}


то она пробросить наиболее точный тип.

Хотя возможно, тут найдутся какие-то ещё подводные грабли.
Перекуём баги на фичи!
Re[4]: Не могу найти пример бага, который я не понял
От: Кодт Россия  
Дата: 05.11.24 16:29
Оценка:
Здравствуйте, so5team, Вы писали:

S>Начиная с C++11 от этого можно попробовать защититься запретив конструктор, который принимает rvalue references. Что и было показано в том примере.


Ключевое слово — "попробовать".
К сожалению, есть огромное количество способов протухлить ссылки. Тут всю систему типов менять надо. И получится что-то наподобие раста (и то не факт, что получится нечто совершенное).
Перекуём баги на фичи!
Re[4]: Не могу найти пример бага, который я не понял
От: Igore Россия  
Дата: 06.11.24 08:10
Оценка:
Здравствуйте, so5team, Вы писали:

S>Проблема в том, что 42 -- это временный экземпляр типа int, фактически это rvalue (или как оно там по стандарту правильно называется).

S>Но ссылка на rvalue в С++ неявным образом преобразуется к const-ссылке, поэтому в Data уходит константная ссылка на временный объект.
Спасибо за разъяснение, но у меня сразу 2 вопроса возникает.
1) Разве константная ссылка не продляет время жизни временного объекта
2) В данном примере почему 42 не попадает под .rodata, оптимизатор?
Re[4]: Не могу найти пример бага, который я не понял
От: vdimas Россия  
Дата: 19.11.24 03:03
Оценка:
Здравствуйте, so5team, Вы писали:

S>Соответственно, как только завершается выражение, в котором конструктор вызывался, временный объект перестает существовать, а ссылка на него протухает.


Да вроде разрешено продлять время жизни захваченного объекта до конца scope.
Т.е., вот так было безопасно писать:
const int & i = 42;
std::cout << i << std::endl;
Re[6]: Не могу найти пример бага, который я не понял
От: vdimas Россия  
Дата: 19.11.24 03:10
Оценка:
Здравствуйте, qaz77, Вы писали:

I>>1) Разве константная ссылка не продляет время жизни временного объекта

Q>Продлевается только в одном scope:
Q>
Q>{
Q>   {
Q>      const int &r = 42;
Q>      // тут r жива  
Q>   }
Q>   // а тут уже нет
Q>}
Q>


В исходном примере, скорее, так:
{
  const int &tmp = 42; // текущий scope
  {
    const int &r = tmp; // scope выражения-вызова конструктора
  }
}


ИМХО, время жизни временного объекта 42 должно быть продлено.
Отредактировано 19.11.2024 6:22 vdimas . Предыдущая версия .
Re[5]: Не могу найти пример бага, который я не понял
От: so5team https://stiffstream.com
Дата: 19.11.24 04:42
Оценка:
Здравствуйте, vdimas, Вы писали:

S>>Соответственно, как только завершается выражение, в котором конструктор вызывался, временный объект перестает существовать, а ссылка на него протухает.


V>Да вроде разрешено продлять время жизни захваченного объекта до конца scope.


Это не тот случай.

V>Т.е., вот так было безопасно писать:

V>
V>const int & i = 42;
V>std::cout << i << std::endl;
V>


Повторюсь, это не тот случай.
Re[7]: Не могу найти пример бага, который я не понял
От: Кодт Россия  
Дата: 20.11.24 00:32
Оценка:
Здравствуйте, vdimas, Вы писали:

V>В исходном примере, скорее, так:

V>
V>{
V>  const int &tmp = 42; // текущий scope
V>  {
V>    const int &r = tmp; // scope выражения-вызова конструктора
V>  }
V>}
V>


V>ИМХО, время жизни временного объекта 42 должно быть продлено.


Ну вот вообще не так!

Проблема же в том, что функция min получает ссылки — и возвращает ссылки. А принимающая сторона ничего не знает про время жизни этих возвращённых ссылок, поэтому и продлевать не может.

Нужно написать такую версию min, которая если получает хотя бы один rvalue reference, то должна возвращать rvalue, и пусть принимающая сторона делает copy elision и продлевает жизнь как хочет, на своё усмотрение.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.