Exception 是否有c++;11个需要启用异常的标准库接口?

Exception 是否有c++;11个需要启用异常的标准库接口?,exception,c++11,c++-standard-library,Exception,C++11,C++ Standard Library,通过阅读c++11草案的N3242版本,可以看出标准库接口的某些组件(特别是线程和锁定)依赖于异常处理 由于我在禁用异常的情况下做了很多工作,我想知道如果不启用异常处理,哪些库组件/功能(实际上或逻辑上)将不可用?首先(提醒一下),禁用异常和RTTI是编译器特定的扩展,标准没有考虑这些扩展 由于标准库通常与编译器相关联,因此可能是您的标准库实现专门设计用于处理这一问题(尤其是处理new返回空指针而不是引发std::bad_alloc) 因此,你所要求的是非感官的。查看您自己的库的文档以获得完整的

通过阅读c++11草案的N3242版本,可以看出标准库接口的某些组件(特别是线程和锁定)依赖于异常处理

由于我在禁用异常的情况下做了很多工作,我想知道如果不启用异常处理,哪些库组件/功能(实际上或逻辑上)将不可用?

首先(提醒一下),禁用异常和RTTI是编译器特定的扩展,标准没有考虑这些扩展

由于标准库通常与编译器相关联,因此可能是您的标准库实现专门设计用于处理这一问题(尤其是处理
new
返回空指针而不是引发
std::bad_alloc

因此,你所要求的是非感官的。查看您自己的库的文档以获得完整的列表

这就是说,该标准确实保证了一些操作永远不会抛出。我不知道有哪种操作会吞咽异常,我想它们中的大多数实际上是安全的

例如,所有算法都应该是安全的


尽管如此,我还是再次建议您阅读您的实现文档。

这个问题已经有一个多月了,还没有答案

我提供的答案可以被视为一个社区维基,添加到它的需要

  • std::thread
    第30.2.2节。及物的使用本机实现实现的抽象

  • std::mutex
    std::recursive\u mutex
    std::timed\u mutex
    std::recursive\u timed\u mutex
    。第30.4.1节,不及物性,如果您提供自己的无异常锁定(通过
    BasicLockable
    Lockable
    TimedLockable
    )。使用本机实现实现的抽象

  • std::条件变量
    第30.5节。及物的使用本机实现实现的抽象


注意:还会有更多。

实际上,所有功能都是可用的,直到抛出实际的异常为止。然后你的程序崩溃了。如果库函数可以抛出,这是在标准中指定的,因此在某种程度上有一个列表-标准本身。@n.m.看来您可能读了我的文章,使用了错误的“实际上”定义:。如果不是,那么像
std::vector.at(size\u t)
这样的东西与程序/环境的线程和锁定在复杂性和局部性上是有区别的。在实现了线程和锁定库之后,我可以告诉您,您可以轻松且可预测地抵御前者。保护自己不受后者的影响要复杂得多。当事情确实出错时,未经处理的异常不是解决方案(对我们中的一些人来说)。我不能忽略这些错误:)因此,我不能依赖库的线程和锁定实现,因为库提供的唯一防御是异常。总之,线程和锁定接口不适合禁用异常的程序。希望对您有所帮助。这里有一些常见的
新的
变体,用于避免
错误的\u alloc
nothrow\t
是库提供的内置形式,其他(包括用户定义的分配器)可以通过新的位置由用户定义。对于集合,可以指定一个不抛出:
std::vector
的分配器,然后只要遵守规则,vector的接口就基本可用。(CONT)(CONT)(CONT)有复杂的高质量C++程序,它们不依赖于异常。你的帖子确实有优点(+1),但我认为在这种情况下可以做出一些概括——同样,我的例子是线程(不安全)、锁定(不安全),现在是向量(如果没有人的生命依赖于它,接口可以安全使用)。@Justin:我不是说这不可能,我只是说这不是标准。例如,即使存在
new(nothrow\u t)
,向量
也可能不使用它。现在,我知道有些库编译时没有异常,例如LLVM/Clang就是其中之一。然而,他们也重新定义了大多数实用程序类。啊,很抱歉误解了。