Последовательность привязки параметров после оценки аргумента? - PullRequest
13 голосов
/ 29 августа 2011

Предположим, у меня есть следующая функция:

void foo(std::vector<int> vec, int n);

Если я вызываю функцию следующим образом:

std::vector<int> numbers { 2, 3, 5, 7, 11, 13, 17, 19 };
foo(std::move(numbers), numbers[0]);

Все ли аргументы полностью оценены перед привязкой к их параметрам?В этом случае std::move безвреден, поскольку он просто возвращает значение x, ссылающееся на numbers.Или каждый отдельный аргумент может быть немедленно связан с его параметром, как только он будет оценен?В этом случае numbers[0] может вызвать неопределенное поведение, поскольку numbers уже может быть перемещен в vec.

1 Ответ

10 голосов
/ 29 августа 2011

В разделе 1.9 / 15 нам сказали, что:

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

И по разделу 5.2.2 / 4:

(...) Инициализация и уничтожение каждого параметра происходит в контексте вызывающая функция. (...)

Я не смог найти другой соответствующий текст в окончательном варианте. Поскольку это явно не определяет секвенированную до взаимосвязь между оценкой аргументов и инициализацией параметров, они не секвенированы и std::move не безвредны.

Решением этой проблемы было бы использование последовательности с временной переменной:

std::vector<int> numbers { 2, 3, 5, 7, 11, 13, 17, 19 };
int num = numbers[0];
foo(std::move(numbers), num);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...