由于引入了noexcept
并解决了throw()
的许多问题,因此现在有理由指定函数是否不抛出异常。虽然它不是编译时间限制,但它将使编译器能够进行一些潜在的优化,如果没有其他条件,还会为函数的用户提供一个信令和文档。
有鉴于此,当我浏览标准函数(如:std::time
、std::timespec_get
和std::memcmp
)时,发现它们都没有使用noexcept
说明符,这实际上让我有点惊讶。这并不是说根本没有函数在使用它,在标准库中,例如std::tie
函数使用它,其他函数也使用它。但是有很大一部分函数,不要使用它。
我猜这对于在某些情况下具有未定义行为的函数是有意义的,比如std::strlen
,因为这将给实现者更多的自由。
但是对于不存在可能导致未定义行为的特定情况的函数,以及明显不抛出异常的函数,为什么不使用noexcept
说明符来声明这些函数呢?
这不仅仅是因为保持了与旧C函数的相似性,因为例如std::timespec_get
是C++11中的一个新函数,所以它一定是出于其他原因。
编译器很可能足够聪明,能够检测到函数不会抛出异常,并因此能够执行相同的优化。但在我看来,noexcept
最好的论据之一是文档价值,它来自于它,当它缺失时,它将会缺乏。
这就引出了我的最后一个假设,即标准库中缺少的noexcept
说明符实际上是疏忽的,就像missing std::make_unique
的情况一样。但与在C++14中纠正(实现)的缺失的std::make_unique
不同,上面的函数(在C++17中)仍然没有成为noexcept
。
有没有人知道缺少noexcept
说明符背后的原因,或者我认为这是一个疏忽?
发布于 2017-09-22 10:10:57
重新表述你上面写的内容,
当对象通过指针传递时,如何保证除之外的不存在?
当你编写你的自定义类/函数时,你可以在不保证抛出任何异常的情况下标记任何东西。但是,当您不能绝对确定函数在任何情况下都不会抛出异常时,您可能不想这样做。
https://stackoverflow.com/questions/44421227
复制相似问题