【问题标题】:Why are std::array::front and std::array::back not noexcept?为什么 std::array::front 和 std::array::back 不是 noexcept?
【发布时间】:2015-12-14 15:17:49
【问题描述】:

我不熟悉使用 noexcept 说明符,我不明白为什么 std::array::frontstd::array::back 没有声明为 noexcept(而 std::array::beginstd::array::end 是)。

这是什么原因?

【问题讨论】:

  • 好问题。在数组大小非零的情况下,它们必须有条件地为 noexcept。但是供应商可以加强无例外性,因为 QoI...
  • @KerrekSB 甚至不是有条件的,因为std::array<T, 0> 可以专门化为没有那些noexceptstd::array<T, N> 相反。不幸的是,该标准没有提供这一点。

标签: c++ arrays c++11 c++14 noexcept


【解决方案1】:

来自cppreference

零长度数组(N == 0) 有一种特殊情况。在这种情况下,array.begin() == array.end(),这是一些独特的价值。对大小为零的数组调用 front()back() 的效果是未定义的。

所以既然我们可以有一个 0 大小的数组 front()back() 可能会导致异常

why the standard doesn't mandate operator[], front and back be marked noexcept上引用Sebastian Redl

noexcept 的标准政策是只标记不能或不能失败的函数,而不是那些简单地指定不抛出异常的函数。换句话说,所有具有有限域的函数(传递错误的参数并且你得到未定义的行为)都不是noexcept,即使它们没有被指定为抛出。

【讨论】:

  • 但这是一个静态条件,所以noexcept 可以是有条件的(就像vector 的默认构造函数一样)。
  • @KerrekSB Maybe relevant?
  • @KerrekSB 添加到答案中。让我知道这是否足够。
  • @NathanOliver 这并不能真正回答 Kerrek 的担忧:在非零 arrayfrontback 上不会失败。这在编译时是已知的(因为数组大小在编译时是已知的),因此这些函数可能是 noexcept,甚至考虑到您添加的报价。
  • 您的答案都不相关。这与狭隘的合同无关。 std::array 不是动态容器。
猜你喜欢
  • 2013-08-20
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 2015-10-19
相关资源
最近更新 更多