[英]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
函数,并且会崩溃,因为s
是nullprt
。
但是,此崩溃与异常无关。 这个假设正确吗?
在:
void do_something(const std::string s) noexcept
参数s
由调用方构造。 也就是说,如果构造std::string
引发异常,则在调用do_something
之前引发该异常。
选择
strlen
是因为它是旧版C函数,并且会崩溃,因为s
是nullptr
。
从技术上讲,通过无效的指针访问内存会导致未定义的行为。 在这种情况下,不会引发C ++异常,并且不需要编译器/运行时来检测到。
不像Java会抛出NullPointerException
。 那些Java检查空指针的方法可能很便宜,但它们并非免费的。
在Linux / Unix上,您最有可能收到SIGSEGV
信号,其默认行为是终止进程。 您可以安装自己的信号处理程序并使其引发C ++异常,但这将导致更加不确定的行为。
因此,最好尽早崩溃,以使代码固定。
但是,此崩溃与异常无关。 这个假设正确吗?
正确,崩溃也不例外。 崩溃可能是由异常引起的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.