gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:22:35 27 4
gpt4 key购买 nike

自从 noexcept 引入并解决了 throw() 的许多问题,现在有一个理由来指定一个函数是否不抛出异常。虽然它不是编译时间限制,但它可以通过编译器实现一些潜在的优化,如果没有别的,信号和文档对函数用户的值(value)。

鉴于此,当我浏览以下标准函数时,我其实有点惊讶: std::time , std::timespec_get , 和 std::memcmp ,并看到他们都没有使用 noexcept说明符。在标准库中,并不像根本没有使用它的函数,例如 std::tie 函数使用它,其他的也一样。但是很大一部分功能,不要用。

我想这对于在某些情况下具有未定义行为的函数是有意义的,例如 std::strlen ,因为这将使实现者有更多的自由。

但是对于没有特定情况会导致未定义行为的函数,并且显然不会抛出异常,为什么不使用 noexcept 声明这些函数?说明符?

这不仅仅是因为与旧的 C 函数保持相似性,例如 std::timespec_get是C++11中的一个新函数,所以肯定是其他原因。

编译器可能非常聪明,可以检测到函数不会抛出异常,因此能够进行相同的优化。但我认为 noexcept 的最佳论据之一是文档的值(value),它来自它,当它丢失时,它就会丢失。

这使我得出了我的最后一个假设,即缺失的 noexcept标准库中的说明符确实是疏忽,就像 missing std::make_unique 的情况一样。 .但不像失踪的std::make_unique已在 C++14 中更正(实现),上述函数仍未(从 C++17 开始)noexcept .

有谁知道丢失noexcept 背后的原因吗?说明符,还是我认为这是一个疏忽是正确的?

最佳答案

改写你上面写的,

当事物通过指针传递时,如何保证noexcept

当您编写自定义类/函数时,您可以将事物标记为 noexcept,但不能保证不会抛出异常。但是当你不确定你的函数在任何情况下都不会抛出时,你可能不想这样做。

关于c++ - 为什么 noexcept 在标准库中没有更多使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44421227/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com