移动std :: runtime_error的构造函数

时间:2015-01-18 19:06:02

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

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

1 个答案:

答案 0 :(得分:14)

explicit runtime_error(string&&);

不存在仅仅因为它不会提供任何优化。

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

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

所以有效的C ++ 11(和转发)包含两个字符串实现:

  1. std::string:这通常是一个短字符串优化类型,带有复制构造函数和能够抛出异常的复制赋值。

  2. std::runtime_error:这是(或持有)不可变引用计数字符串。这绝不会引起复制构建或复制分配。

  3. explicit runtime_error(string&&);

    永远不会(有效地)将资源从“类型1”字符串传输到“类型2”字符串。