由于引入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
说明符背后的原因,或者我是否认为这是一种疏忽?
答案 0 :(得分:1)
改述你上面写的内容,
如果通过指针传递内容,你怎么能保证 noexcept ?
当你编写自定义类/函数时,你可以标记noexcept而不保证不抛出任何异常。但是当你不完全确定你的函数不会抛出任何情况时,你可能不想这样做。