【问题标题】:Is std::string's default constructor no-throw?std::string 默认构造函数不抛出吗?
【发布时间】:2013-01-20 02:41:29
【问题描述】:

可以 std::string s; 在任何情况下抛出?这是标准规定的吗(对C++03感兴趣,以防有差异)?

【问题讨论】:

  • 我手边没有03,但在11中,移动构造函数是唯一标记noexcept的。
  • 我希望移动构造函数在 C++11 中为 noexcept,并且出于明显的原因允许抛出复制构造函数,但是一个空构造函数......我相信它可能很特别- 不分配任何东西,但问题是这样完成的。

标签: c++ stdstring c++03 default-constructor nothrow


【解决方案1】:

在 C++11 中,默认构造函数实际上采用一个(默认)参数,即分配器(21.4.2):

explicit basic_string(const Allocator& a = Allocator());

此构造函数未声明为noexcept。 (我想这需要分配器有一个不抛出的复制构造函数。)正如 Jonathan 和 Bo 指出的那样,分配器的复制构造函数不能抛出任何异常,但允许执行字符串的构造函数投掷操作(例如分配一块初始内存)。当然应该可以编写一个类似字符串的类,作为不抛出的constexpr 构造函数,但标准库字符串没有指定为那样。

【讨论】:

  • 分配器要求说分配器的复制构造函数“不应通过异常退出”并且std::allocator的复制ctor是noexcept
  • 嗯。我遵循了默认构造期间调用的内容,结果发现,分配器的构造是throw(),其余的basic_string() 只是将静态分配的数组重新解释为空字符串。只有这个重新解释的部分没有标记throw(),其他的都是。 reinterpret_cast 可以扔吗?
  • 允许字符串构造函数为字符串分配动态内存。这可能会导致bad_alloc。大多数实现都没有,但你不能正式依赖它。
【解决方案2】:

这已被WG21/N4002 更改。我看到的第一份工作文件是WG21/N4296 // 21.4.2, construct/copy/destroy: basic_string() noexcept : basic_string(Allocator()) { }

【讨论】:

    【解决方案3】:

    确定是否由于任何原因无法进行分配

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多