Re[100]: Когда это наконец станет defined behavior?
От: vdimas Россия  
Дата: 22.08.23 07:54
Оценка:
Здравствуйте, vopl, Вы писали:

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


V>>Кстате, в исходном примере можно было переделать на ссылку, чтобы ты по мелочам не придирался:

V>>
V>>const std::map<int, int> & map = buildMap();
V>>

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

V>В этом случае изменится весь кейс.


Не-а.


V>Пропадет NRVO


А почему бы тебе, вместо сотрясения воздуха, предварительно не проверить самостоятельно — пропадается ли NRVO или нет? ))


V>пропадет вторая декларация "того же самого объекта"


Остаётся.
Безымянное/временное значение — такое же "честное" значение, как и локальная переменная, это значение можно захватить для владения в текущем scope.


V>пропадает его константность


Константность не может пропасть, согласно правилам С++ константность можно только добавить.
Обратное будет хаком. ))


V>пропадает "модификация константного объекта", пропадает то "гипотетическое UB".


Если бы вы были в состоянии пояснить суть UB (а не просто ссылаться на стандарт), вы бы увидели, что кейзы равнозначны.

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

Во втором случае компилятор рассматривает локальное временное значение как имеющее алиасинг, т.е. в точности так же, как он рассматривал бы локальную константную переменную, куда поместили бы это значение.
Отредактировано 22.08.2023 8:57 vdimas . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.