Рассмотрим код
auto p = new T( U(std::move(v)) );
Инициализатор тогда U(std::move(v))
, Давайте предположим, что T( U(std::move(v)) )
не бросает. Если инициализатор вычисляется после базового выделения памяти, тогда код строго безопасен для исключений. В противном случае это не так. Было выброшено выделение памяти, v
был бы уже перемещен. Поэтому меня интересует относительный порядок между выделением памяти и оценкой инициализатора. Это определено, не определено или как?
Да, инициализация оценивается после распределения. Цитата C ++ 17 (N4659) [expr.new] 8.3.4 / 19:
Вызов функции распределения выполняется до оценки выражений в новый инициализатор.
Инициализация выделенного объекта выполняется до вычисления значения новое выражение.
Других решений пока нет …