std::runtime_error 的移动构造函数
move constructor for std::runtime_error
为什么 std::runtime_error
不提供接受 std::string&&
的构造函数?查看 the constructors for std::string
,它有一个移动构造函数,但 noexcept
规范仅适用于 C++14,不适用于 C++11。这是一个错误,错过了最后期限还是我遗漏了什么?
explicit runtime_error(string&&);
不存在只是因为它不会提供任何优化。
事实证明,符合 C++11 的 runtime_error
不会在内部存储 std::string
。原因是runtime_error
的复制成员一定不能抛出异常。否则,当编译器在抛出异常的过程中复制异常对象时,可能会抛出错误的异常。
这意味着 runtime_error
需要存储一个不可变的引用计数字符串。然而,C++11 禁止 std::string
的 COW 实现。 std::string
的实现已经移动到 "short-string-optimization",如果字符串的长度超过 "short limit",它必须在复制构造上分配。并且用于构造runtime_error
.
的字符串长度没有限制
如此有效的 C++11(及后续版本)包含两个字符串实现:
std::string
:这通常是一个短字符串优化类型,具有能够抛出异常的复制构造函数和复制赋值。
std::runtime_error
:这是(或持有)一个不可变的引用计数字符串。这永远不会引发复制构造或复制赋值。
和
explicit runtime_error(string&&);
永远无法(有效地)将资源从 "type 1" 字符串转移到 "type 2" 字符串。
为什么 std::runtime_error
不提供接受 std::string&&
的构造函数?查看 the constructors for std::string
,它有一个移动构造函数,但 noexcept
规范仅适用于 C++14,不适用于 C++11。这是一个错误,错过了最后期限还是我遗漏了什么?
explicit runtime_error(string&&);
不存在只是因为它不会提供任何优化。
事实证明,符合 C++11 的 runtime_error
不会在内部存储 std::string
。原因是runtime_error
的复制成员一定不能抛出异常。否则,当编译器在抛出异常的过程中复制异常对象时,可能会抛出错误的异常。
这意味着 runtime_error
需要存储一个不可变的引用计数字符串。然而,C++11 禁止 std::string
的 COW 实现。 std::string
的实现已经移动到 "short-string-optimization",如果字符串的长度超过 "short limit",它必须在复制构造上分配。并且用于构造runtime_error
.
如此有效的 C++11(及后续版本)包含两个字符串实现:
std::string
:这通常是一个短字符串优化类型,具有能够抛出异常的复制构造函数和复制赋值。std::runtime_error
:这是(或持有)一个不可变的引用计数字符串。这永远不会引发复制构造或复制赋值。
和
explicit runtime_error(string&&);
永远无法(有效地)将资源从 "type 1" 字符串转移到 "type 2" 字符串。