为什么noexcept在标准库中没有使用更多?

时间:2017-06-07 19:25:33

标签: c++ c++11

由于引入noexcept并解决了throw()的许多问题,现在有理由指定函数是否不引发异常。虽然它不是编译时间限制,但它将使编译器能够进行一些潜在的优化,如果没有其他任何内容,则为函数用户提供信号和文档值。

鉴于此,当我浏览标准函数时,我感到有些惊讶:std::timestd::timespec_getstd::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说明符背后的原因,或者我是否认为这是一种疏忽?

1 个答案:

答案 0 :(得分:1)

改述你上面写的内容,

如果通过指针传递内容,你怎么能保证 noexcept

当你编写自定义类/函数时,你可以标记noexcept而不保证不抛出任何异常。但是当你不完全确定你的函数不会抛出任何情况时,你可能不想这样做。