спецификатор noexcept с конструкцией аргументов по умолчанию - PullRequest
0 голосов
/ 10 мая 2018

Возьмите следующий пример кода:

void test(const Item& item = Item()) {
   ...
}

Предположим, что после того, как item передан функции, он не может выбросить.

Вопрос в том, что функция должна быть помечена noexcept или noexcept(noexcept(Item()))?

IHMO, первое должно быть в порядке, но я не уверен. Цитата из стандарта будет очень признателен!

1 Ответ

0 голосов
/ 10 мая 2018

Аргументы по умолчанию являются сокращенными обозначениями для вызывающей функции.Таким образом, когда функция выполняется, построение уже завершено.

Таким образом, noexcept должно быть достаточно.

В стандарте [dcl.fct.default]состояния:

Если в объявлении параметра указано предложение инициализатора, это предложение инициализатора используется в качестве аргумента по умолчанию.Аргументы по умолчанию будут использоваться в вызовах, где отсутствуют конечные аргументы.

Пример: объявление void point(int = 3, int = 4); объявляет функцию, которую можно вызывать с нулевым, одним или двумя аргументами типа int.Его можно вызвать любым из следующих способов: point(1,2); point(1); point(); Последние два вызова эквивалентны point(1,4) и point(3,4) соответственно.

Также имеется примечание(в [intro.execution] Выполнение программы):

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

...