交换基本类型的对象可以抛出吗?

时间:2018-10-09 14:27:05

标签: c++ pointers exception swap

由标准保证的std::swap交换基本类型的对象(整数,字符,布尔值,指针等)是否不会引发异常吗?我想这个问题一定是以前问过的,但是我不能用Google来问这个问题。

我知道std::is_nothrow_swappable的定义,但是然后,我不知道基本类型是否也是 NothrowConstructible NotrhowAssignable

(我对交换指针特别感兴趣。)

2 个答案:

答案 0 :(得分:-2)

For pointers,该方法指定noexpect
对于非指针,如果值为is_nothrow_move_constructibleis_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。指针是内部类型。

因此,保证。

Layman的推理:

如果基本类型的交换不是nothrow,则不可能。由于所有类型都是直接或间接地由基本类型组成。

评论和下注的结果:

虽然该标准确实不包含任何明确的要求,即不会抛出基本类型的分配,但也没有说有可能分配基本类型导致引发异常。

实际上,[expr.throw]仅表示引发异常的一种方法-执行 throw-expression

我对术语“基本类型”的含义的理解意味着一种由字节模式表示的类型,仅此而已。在我看来,在CPU级别上仅字节的移动将导致高级操作,例如引发c ++异常,这是非常不合逻辑的。

但是,无论是否不言而喻,我必须认为,在标准中没有任何地方实际上说 ,将指针分配给指针不会导致异常。

尽管如此,我还是猴子的叔叔。 :)