Может ли обмен объектами фундаментальных типов бросать? - PullRequest
0 голосов
/ 09 октября 2018

Гарантируется ли в стандарте обмен объектами фундаментальных типов (целые числа, символы, bool, указатели, ...) на std::swap, что исключение не является исключением?Я думаю, что этот вопрос должен был быть задан ранее, но я не могу Google ни один такой.

Мне известно определение std::is_nothrow_swappable, но я не знаю, являются ли фундаментальные типы NothrowConstructible и NotrhowAssignable .

(меня особенно интересует обмен указателями.)

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Гарантируется ли стандартом обмен объектами фундаментальных типов (целыми числами, символами, bools, указателями, ...) с помощью std :: swap, что исключение не является исключением?

Да

Документация:

https://en.cppreference.com/w/cpp/algorithm/swap

см. Примечание 1:

Меняет местами значения a и b.Эта перегрузка не участвует в разрешении перегрузки, если std::is_move_constructible_v<T> && std::is_move_assignable_v<T> не является истинным

Следуя документации по кроличьей норе, мы знаем, что внутренние типы являются trvially_nothrow_constructible.Указатели являются внутренними типами.

Следовательно, гарантировано.

Аргументация дилетанта:

Если обмен фундаментальных типов не является nothrow, то ничего не может быть.Поскольку все типы состоят, прямо или косвенно, из основных типов.

Результаты комментариев и отрицательных голосов:

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

Действительно, [expr.throw] указывает толькоодин из способов выбросить исключение - выполнить throw-выражение .

Мое прочтение значения термина «Фундаментальный тип» подразумевает тип, который представлен байтовым шаблоном и ничего более.Мне кажется крайне нелогичным, что перемещение простых байтов на уровне ЦП приведет к высокоуровневой операции, например, к исключению с ++.

Однако я должен признать, независимо от того, очевиден он или нет,что нигде в стандарте фактически не говорится , что назначение указателя на указатель не приведет к исключению.

Тем не менее, я буду дядей обезьяны, если это произойдет.:)

0 голосов
/ 09 октября 2018

Для указателей метод определяет noexpect.
Для не указателей это noexpect, если значение is_nothrow_move_constructible и is_nothrow_move_assignable, что верно для «фундаментальных» типов (также называемых примитивами, например, int, float, char).

...