由标准保证的std::swap
交换基本类型的对象(整数,字符,布尔值,指针等)是否不会引发异常吗?我想这个问题一定是以前问过的,但是我不能用Google来问这个问题。
我知道std::is_nothrow_swappable
的定义,但是然后,我不知道基本类型是否也是 NothrowConstructible 和 NotrhowAssignable 。>
(我对交换指针特别感兴趣。)
答案 0 :(得分:-2)
For pointers,该方法指定noexpect
。
对于非指针,如果值为is_nothrow_move_constructible
和is_nothrow_move_assignable
,则为noexpect
,这对于“基本”类型(也就是原语,例如int,float,char)是正确的。
答案 1 :(得分:-2)
使用标准保证的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-expression 。
我对术语“基本类型”的含义的理解意味着一种由字节模式表示的类型,仅此而已。在我看来,在CPU级别上仅字节的移动将导致高级操作,例如引发c ++异常,这是非常不合逻辑的。
但是,无论是否不言而喻,我必须认为,在标准中没有任何地方实际上说 ,将指针分配给指针不会导致异常。
尽管如此,我还是猴子的叔叔。 :)