Оценивается ли инициализатор после выделения памяти в новом выражении?

Рассмотрим код

auto p = new T( U(std::move(v)) );

Инициализатор тогда U(std::move(v)), Давайте предположим, что T( U(std::move(v)) ) не бросает. Если инициализатор вычисляется после базового выделения памяти, тогда код строго безопасен для исключений. В противном случае это не так. Было выброшено выделение памяти, v был бы уже перемещен. Поэтому меня интересует относительный порядок между выделением памяти и оценкой инициализатора. Это определено, не определено или как?

7

Решение

Да, инициализация оценивается после распределения. Цитата C ++ 17 (N4659) [expr.new] 8.3.4 / 19:

Вызов функции распределения выполняется до оценки выражений в новый инициализатор.
Инициализация выделенного объекта выполняется до вычисления значения новое выражение.

8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]