为什么std::runtime_error
没有提供接受std::string&&
的构造函数?查看the constructors for std::string
,它有一个移动构造函数,但noexcept
规范只适用于C ++ 14,而不是C ++ 11。这是一个错误,错过了最后期限还是我错过了什么?
答案 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(和转发)包含两个字符串实现:
std::string
:这通常是一个短字符串优化类型,带有复制构造函数和能够抛出异常的复制赋值。
std::runtime_error
:这是(或持有)不可变引用计数字符串。这绝不会引起复制构建或复制分配。
和
explicit runtime_error(string&&);
永远不会(有效地)将资源从“类型1”字符串传输到“类型2”字符串。