【发布时间】:2015-07-25 04:48:29
【问题描述】:
例如,有两种不同的方法来访问私有数组的元素是很常见的,重载数组下标运算符,或者定义at:
T& operator[](size_t i) { return v[i]; }
T const& operator[](size_t i) const { return v[i]; }
T& at(size_t i)
{
if (i >= length)
throw out_of_range("You shall not pass!");
return v[i];
}
T const& at(size_t i) const
{
if (i >= length)
throw out_of_range("You shall not pass!");
return v[i];
}
at 版本可以抛出异常,但数组下标运算符不能。
我的问题是,尽管 operator[] 不会引发异常,但即使知道它可以引发 SIGSEGV 信号,是否也可以将其标记为 noexcept,还是只是一种不好的做法?
我想指出一个信号(如 SIGSEGV)也不例外。从字面上解释noexcept 的含义,noexcept 函数声称它不会抛出异常。它没有说明其他任何事情(包括信号)。
但是,noexcept 函数的意义远不止于此,至少对于我的代码的客户而言。 noexcept 还隐含地表示该函数是安全的,它将在没有计算错误的情况下完成其执行。
那么,将noexcept 标记为不安全的函数是否不合适?
【问题讨论】:
-
信号也不例外。
-
这绝对是一个可靠的问题。但是正如您所说的“信号不是异常”,@ 987654331@ 只是声明它不会抛出异常 - 它不会 - 但不会对异常行为做出任何其他保证(即产生未定义的行为/重新启动您的系统/格式化您的硬盘等)
-
noexcept不仅仅是在当前实现中不抛出异常的函数的标记:它也是对用户的保证,该函数永远不会抛出例外。也就是说,用户将依赖此保证,并且您将无法在以后添加边界检查(例如在测试/调试配置中)而不冒中止整个程序的风险。 -
@dyp 这就是答案。
-
是的,没错。如果我现在决定忽略绑定检查,我以后就不能再检查了。我同意你的看法。但这不是我的问题(尽管这是一个好点)。我已经刷新了我的问题,以便更明确地提出我要问的问题。