string - move std::runtime_error 的构造函数

标签 string exception c++11 move c++14

为什么std::runtime_error不提供接受 std::string&& 的构造函数?看着 the constructors for std::string ,它有一个 move 构造函数,但 noexcept规范仅适用于 C++14,而不适用于 C++11。这是一个错误,错过了最后期限还是我错过了什么?

最佳答案

explicit runtime_error(string&&);
不存在仅仅因为它不会提供任何优化。

事实证明,符合 C++11 的 runtime_error不会在内部存储 std::string .原因是runtime_error的复制成员(member)不得抛出异常。否则编译器在抛出异常对象的过程中复制异常对象时,可能会抛出错误的异常。

这意味着 runtime_error需要存储一个非可变的引用计数字符串。然而,C++11 禁止 std::string 的 COW 实现. std::string 的实现已转移到“短字符串优化”,如果字符串的长度超出“短限制”,则必须在复制构造时进行分配。并且用于构造 runtime_error 的字符串长度没有限制。 .

如此有效的 C++11(和向前)包含字符串的两个实现:

  • std::string :这通常是一种短字符串优化类型,具有能够抛出异常的复制构造函数和复制赋值。
  • std::runtime_error :这是(或持有)一个不可变的引用计数字符串。这永远不会引发复制构造或复制分配。


  • explicit runtime_error(string&&);
    永远不能(有效地)将资源从“类型 1”字符串转移到“类型 2”字符串。

    关于string - move std::runtime_error 的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28013615/

    相关文章:

    c++ - std::array 构造函数继承

    C++ 通过访问器返回一个字符串

    android - 如何解决 Conversion to Dalvik format failed with error 1?

    c++ - 抛出异常c++后内存泄漏

    c++ - vector 和列表的 end() 迭代器的语义

    c++11 - 在 C++11 中编写持有 STL 容器的类的构造函数的最佳方法

    c++ - 有没有办法在 Windows 的 basic_iostream 上获得非锁定流插入/提取?

    java - StringBuilder.append() 方法是否填满了字符串池?

    python - 有什么方法可以在字符串文字中使用变量值吗?

    java - 并发修改异常