【问题标题】:Can swapping objects of fundamental types throw?交换基本类型的对象可以抛出吗?
【发布时间】:2019-03-14 08:57:15
【问题描述】:

标准是否保证用std::swap 交换基本类型(整数、字符、布尔值、指针...)的对象不会引发异常?我想这个问题之前一定有人问过,但我不能谷歌任何这样的问题。

我知道std::is_nothrow_swappable 的定义,但是我不知道基本类型是否也是NothrowConstructibleNotrhowAssignable

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

【问题讨论】:

  • 交换基本类型的对象如何引发异常?
  • 我不知道标准中有任何明确保证基本类型交换是 noexcept 的。话虽如此,我相信你想多了。我还没有看到一个平台不会出现这种情况。
  • 好问题。不可能在没有争议和对语言目标的某种程度假设的情况下回答。 :)

标签: c++ pointers exception swap


【解决方案1】:

标准是否保证用 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,那么什么都不是。因为所有类型都直接或间接地由基本类型组成。

cmets 和 downvotes 的结果:

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

确实,[expr.throw] 仅表示抛出异常的一种方式——执行 throw-expression

我对“基本类型”一词含义的解读意味着一种由字节模式表示的类型,仅此而已。对我来说,仅在 CPU 级别移动字节就会导致高级操作(例如抛出 c++ 异常),这似乎非常不合逻辑。

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

不过,如果可以的话,我会成为猴子的叔叔。 :)

【讨论】:

  • 能否请您从标准中添加引用?还是这是不言自明的?
  • 一个简单的“是”肯定不足以回答这样的问题。
  • @SergeyA 这个问题不需要详细说明。
  • 仍然是这样的答案,最多评论。
  • 还是不够好。这一点已经在问题本身中得到体现。它在哪里说intrinsic types are trvially_nothrow_constructible
【解决方案2】:

For pointers,方法指定noexpect
对于非指针,如果值为is_nothrow_move_constructibleis_nothrow_move_assignable,则为noexpect,这对于“基本”类型(也称为原语,例如int、float、char)是正确的。

【讨论】:

  • 指定noexcept
  • 指针的特化/重载在哪里定义?我在您提供的链接页面中没有看到它。我只看到数组的重载。
  • 指针没有重载。只是数组的重载是 noexcept 如果交换指针是 noexcept,但页面上没有任何地方有一个声明是否交换指针是 noexecpt
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2011-12-01
  • 2013-01-13
  • 1970-01-01
  • 2016-10-26
  • 1970-01-01
相关资源
最近更新 更多