Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么在标准库中没有更多地使用noexcept?_C++_C++11 - Fatal编程技术网

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是函数类型的一部分)。