C++ 为什么在标准库中没有更多地使用noexcept?
由于引入并解决了许多问题,现在有理由指定函数是否不会引发异常。虽然这不是编译时限制,但它将允许编译器进行一些潜在的优化,如果没有其他优化,则为函数的用户提供一个信号和文档值 有鉴于此,当我浏览诸如:、和等标准函数时,发现它们都没有使用C++ 为什么在标准库中没有更多地使用noexcept?,c++,c++11,C++,C++11,由于引入并解决了许多问题,现在有理由指定函数是否不会引发异常。虽然这不是编译时限制,但它将允许编译器进行一些潜在的优化,如果没有其他优化,则为函数的用户提供一个信号和文档值 有鉴于此,当我浏览诸如:、和等标准函数时,发现它们都没有使用noexcept说明符,我实际上有点惊讶。这并不是说根本没有函数在使用它,例如,在标准库中,函数使用它,其他函数也使用它。但大部分函数都不使用它 我想这对于在某些情况下具有未定义行为的函数是有意义的,例如,因为这将允许实现者更自由 但是,对于那些没有特定情况(可能导
noexcept
说明符,我实际上有点惊讶。这并不是说根本没有函数在使用它,例如,在标准库中,函数使用它,其他函数也使用它。但大部分函数都不使用它
我想这对于在某些情况下具有未定义行为的函数是有意义的,例如,因为这将允许实现者更自由
但是,对于那些没有特定情况(可能导致未定义的行为)且显然不会引发异常的函数,为什么不使用noexcept
说明符声明这些函数呢
这不仅仅是因为保持了与旧C函数的相似性,因为例如std::timespec_get
是C++11中的一个新函数,所以它一定是出于其他原因
编译器可能非常聪明,能够检测到函数不会抛出异常,因此能够进行相同的优化。但在我看来,noexcept
的最佳论据之一是文档价值,它来自于文档价值,当文档价值缺失时,文档价值就会缺失
这就引出了我的最后一个假设,即标准库中缺少的noexcept
说明符实际上是疏忽,就像标准库中的情况一样。但是,与C++14中更正(实现)的缺少的std::make_unique
不同,上述函数(从C++17开始)仍然没有生成noexcept
有人知道缺少的
noexcept
说明符背后的原因吗,或者我认为这是一个疏忽是对的吗?重新表述您上面写的内容
当事情通过指针传递时,您如何保证没有异常
在编写自定义类/函数时,可以将对象标记为noexcept,但不能保证不会引发异常。但是,当您不能绝对确定您的函数在任何情况下都不会抛出时,您可能不想这样做 你得问问礼让部。请记住,一旦您声明了一个函数
noexcept
,删除它将是一个破坏性的更改。您可以在以后添加它,同时保持向后兼容性。请参阅第一段。可能就是你所看到的for@TommyAndersen您能给我举一个函数的例子吗?该函数不能或一定不能失败,但未标记为noexcept
?还有一个链接指向CPP核心指南中关于noexcept
的内容。如果您认为有些函数确实应该是noexcept
,但目前不是,那么这样做不会有任何负面影响(我并不是说没有这样的函数),你为什么不写一个提案给标准委员会考虑包括你的理由并提交给它?你知道,标准并不是靠魔法演变的;它要求公众有知识和参与的成员参与以取得良好的进展:)现实中,C++库实现常常无法控制C库实现,因此向C库添加C++特定的擦除是困难的。(尤其是现在noexcept是函数类型的一部分)。