Гарантируется ли стандартом обмен объектами фундаментальных типов (целыми числами, символами, 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-выражение .
Мое прочтение значения термина «Фундаментальный тип» подразумевает тип, который представлен байтовым шаблоном и ничего более.Мне кажется крайне нелогичным, что перемещение простых байтов на уровне ЦП приведет к высокоуровневой операции, например, к исключению с ++.
Однако я должен признать, независимо от того, очевиден он или нет,что нигде в стандарте фактически не говорится , что назначение указателя на указатель не приведет к исключению.
Тем не менее, я буду дядей обезьяны, если это произойдет.:)