繁体   English   中英

用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是因为它是旧版C函数,并且会崩溃,因为snullptr

从技术上讲,通过无效的指针访问内存会导致未定义的行为。 在这种情况下,不会引发C ++异常,并且不需要编译器/运行时来检测到。

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

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

因此,最好尽早崩溃,以使代码固定。

但是,此崩溃与异常无关。 这个假设正确吗?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM