Неопределенное поведение в порядке списка инициализаторов с использованием семантики перемещения - PullRequest
0 голосов
/ 26 июня 2019

Является ли (1) неопределенным поведением или первый элемент пары всегда оценивается первым?

#include <array>
#include <utility>

int bar(std::array<int, 3>&& ) {
    return 1;
}

std::pair<std::array<int, 3>, int> foo() {
    std::array<int, 3> a;
    return { a, bar(std::move(a)) };  // (1)
}

В качестве примечания, будет ли использование return make_pair(a, bar(std::move(a))); вместо этого другим?

1 Ответ

2 голосов
/ 27 июня 2019

Вы можете увидеть правило порядок оценки .

10) При инициализации списка каждое вычисление значения и побочный эффект данного предложения инициализатора упорядочиваются перед каждым значениемвычисление и побочный эффект, связанный с любым предложением инициализатора, которое следует за ним в заключенном в скобки списке инициализаторов, разделенных запятой., тогда bar(std::move(a)).

В качестве примечания, будет ли использование return make_pair(a, bar(std::move(a))); другим?

Да, это вызов функции и порядок оценкине указаноэто не UB само по себе, но может привести к UB, если один заказ приведет к UB.В вашем случае оба порядка в порядке и дают одинаковый результат.

C ++ 17 добавляет это ограничение, кроме того:

15) При вызове функции, вычислении значений и побочных эффектахИнициализация каждого параметра имеет неопределенную последовательность относительно вычислений значения и побочных эффектов любого другого параметра.

...