首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么在标准库中没有更多地使用noexcept?

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

Stack Overflow用户
提问于 2017-06-08 03:25:33
回答 1查看 758关注 0票数 17

由于引入了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说明符背后的原因,或者我认为这是一个疏忽?

EN

回答 1

Stack Overflow用户

发布于 2017-09-22 10:10:57

重新表述你上面写的内容,

当对象通过指针传递时,如何保证除之外的不存在?

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44421227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档