当前位置: 首页 > 知识库问答 >
问题:

std::vector 默认构造函数能否引发异常

汪安然
2023-03-14

如果我构造一个空的std::向量使用默认的构造函数(和默认的分配器),它可以抛出一个异常吗?

通常,为容器的元素分配空间会引发异常(这将是一个<code>std::bad_alloc</code>)。但是<code>std::vector</code>的默认构造函数不需要分配任何这样的空间;它可以在第一次插入或分配时惰性地分配一些空间。但是C标准是否要求它不抛出异常(意味着延迟分配,或者捕获<code>std::bad_alloc</code>然后返回到延迟分配)?

共有1个答案

尤俊誉
2023-03-14

它取决于Allocator的默认构造函数。std::向量的默认构造函数声明为

vector() noexcept(noexcept(Allocator())); (since C++17)

如果使用 std::allocator,那么它就是 noexcept(true);即不会引发异常。

allocator() noexcept; (since C++11)

因此,在C17之前,或者如果使用非默认分配器,抛出异常是可能的。

 类似资料:
  • 当索引仅在运行时已知时,从所需类型的索引默认构造std::variant的最简单方法是什么?换句话说,我想写: 请注意,不能设置为constexpr,因此在这里不起作用。 当然,这里的问题是,由于不知道在编译时要调用中的哪个构造函数,所以基本上必须在编译时生成一个包含所有可能的构造函数(或者可能是要从中复制的默认构造变量)的表,然后在运行时访问该表。这里显然有一些模板魔法,但是什么是最干净的方法呢

  • 问题内容: 默认构造函数到底是什么?你能告诉我以下哪个是默认构造函数,它与其他构造函数有何不同? 问题答案: 他们都不是。如果定义,则不是默认值。 除非你定义另一个构造函数,否则默认构造函数是自动生成的无参数构造函数。任何未初始化的字段都将设置为其默认值。对于你的榜样,它看起来像这样假设的类型String,int以及int,那类本身是公共的: 这与 完全没有构造函数。但是,如果定义至少一个构造函数

  • 大家好,我的JPA项目有问题。java实现了一个接口“filesystemelement.java”这些是我的类application.java 我正在使用Eclipse Juno有什么帮助吗? }

  • 问题内容: 我知道我在这里问一些严重的101问题… 我有一些课,还有一个延伸课。在我有一个构造函数,它接受一组参数,并对其字段进行设置。派生类(例如)通常不需要进行修改。现在我的IDE给我 “ Foo中没有默认的构造函数” 。从一点点谷歌搜索,这似乎是因为“构造函数没有继承”。因此,一切都很好,但是我现在如何使它工作而不在每个派生类中复制此构造函数?我假设有一个更合理的方法? 问题答案: 使用构造

  • 问题内容: 不知何故,在下面的Node类中,and变量在Node的所有实例之间共享。 有什么办法可以让我继续使用构造函数参数的默认值(在这种情况下为空列表),但要同时获取它们和拥有其自身的变量以及变量? 我正在使用python 3.1.2。 问题答案: 可变的默认参数通常不会执行您想要的操作。相反,请尝试以下操作:

  • 为什么: 如果一个类不提供任何然后在编译时由编译器给出,但是如果一个类包含,那么默认构造函数不是由编译器提供。 我正在编译下面的代码。它给出了编译错误。 代码: 控制台错误: 当我只调用。工作正常。但是当您想使用参数化构造函数调用