由于noexcept引入并解决了许多问题throw(),现在有理由指定函数是否不抛出异常.虽然它不是编译时限制,但它将使编译器能够进行一些潜在的优化,如果没有别的,信号和文档,则为函数的用户提供值.
鉴于此我其实是有点惊讶,当我通过标准的功能,如浏览:std::time,std::timespec_get,和std::memcmp,看见他们都不使用的noexcept符.它不像在标准库中根本没有使用它的std::tie功能,例如函数使用它,以及其他功能.但很大一部分功能,不要使用它.
我想对于在某些情况下具有未定义行为的函数是有意义的,例如std::strlen,因为这将使实现者更自由.
但对于没有指定情况可导致未定义行为的函数,以及显然不会抛出异常的函数,为什么不使用说明noexcept符声明这些函数?
它不仅仅是因为与旧C函数保持相似性,因为例如std::timespec_getC++ 11中的新函数,所以它必须是出于某种其他原因.
编译器可能非常聪明,可以检测到函数不会抛出异常,因此可以进行相同的优化.但在我看来,最好的论据之一noexcept是文档值,它来自它,当它缺失时将缺乏.
这让我得出了我的最终假设,noexcept标准库中缺少的说明符实际上是疏忽,就像缺失std::make_unique的情况一样.但与std::make_uniqueC++ 14中修正(实现)的缺失不同,上面的函数仍然没有(从C++ 17开始)noexcept.
有没有人知道失踪noexcept说明者背后的原因,或者我是否认为这是一种疏忽?
小智 1
改写你上面写的内容,
当事物通过指针传递时,如何保证noexcept ?
当您编写自定义类/函数时,您可以将事物标记为 no except ,但不能保证不抛出异常。但是,当您不确定您的函数在任何情况下都不会抛出异常时,您可能不想这样做。
| 归档时间: |
|
| 查看次数: |
578 次 |
| 最近记录: |