Здравствуйте, 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 (а не просто ссылаться на стандарт), вы бы увидели, что кейзы равнозначны.
Суть в том, что компилятор не по каждому константному объекту делает некие допущения и соотв.оптимизации, а только когда видит его жизненный цикл.
Т.е. подать константную ссылку извне в ф-ию, или получить константную ссылку на локальное временное значение — две большие разницы.
Во втором случае компилятор рассматривает локальное временное значение как имеющее алиасинг, т.е. в точности так же, как он рассматривал бы локальную константную переменную, куда поместили бы это значение.