使用 noexcept C++11 正确实现函数

Proper implementation of functions with noexcept C++11

这些函数是否正确实现了 noexcept / throw()

第一个函数

void do_something(const std::string s) noexcept{
    // do something with no exception
}

do_something("Hello");

"Hello" literal 将创建新的 std::string 对象,它可能会抛出异常。

这个异常是在函数外抛出还是在函数内抛出?

第二个函数:

size_t do_something(const char *s) noexcept{
    return strlen(s);
}

do_something(nullptr);
选择

strlen 是因为它是遗留的 C 函数并且会崩溃,因为 snullprt.

然而这次崩溃与异常无关。假设是否正确?

在:

void do_something(const std::string s) noexcept

参数s由调用者构造。也就是说,如果构造 std::string 抛出异常,则在调用 do_something 之前抛出该异常。


strlen is chosen because it is legacy C function and it will crash, because s is nullptr.

从技术上讲,通过无效指针访问内存会导致未定义的行为。在这种情况下不会抛出 C++ 异常,并且不需要 compiler/run-time 来检测它。

不像 Java 抛出 NullPointerException。那些 Java 空指针检查可能很便宜,但它们不是免费的。

在 Linux/Unix 上,您最有可能收到 SIGSEGV 信号,其默认行为是终止进程。您可以安装自己的信号处理程序并使其抛出 C++ 异常,但这会导致更多未定义的行为。

所以,最好是尽早崩溃并大声崩溃,以便修复代码。

However this crash is nothing to do with exceptions. Is the assumption correct?

正确,崩溃也不例外。崩溃可能是由异常引起的。