可能重复:
如何在向量增长时强制执行移动语义?
insert,push_back和emplace(_back)可能导致的重新分配std::vector.我很困惑地看到以下代码复制元素而不是在重新分配容器时移动它们.
#include <iostream>
#include <vector>
struct foo {
int value;
explicit foo(int value) : value(value) {
std::cout << "foo(" << value << ")\n";
}
foo(foo const& other) noexcept : value(other.value) {
std::cout << "foo(foo(" << value << "))\n";
}
foo(foo&& other) noexcept : value(std::move(other.value)) {
other.value = -1;
std::cout << "foo(move(foo(" << value << "))\n";
}
~foo() {
if (value != -1)
std::cout << "~foo(" …Run Code Online (Sandbox Code Playgroud) 我很好奇背后的理由noexcept在的C++ 0x FCD.throw(X)被弃用了,但noexcept似乎做了同样的事情.有noexcept没有在编译时未检查的原因?看起来如果静态检查这些函数它们只会在一个try块中调用抛出函数会更好.
在即将推出的C++ 0x标准中,当在移动构造函数中/期间抛出异常时会发生什么?
原始物体会保留吗?或者是处于未定义状态的原始对象和移动对象?语言提供的保证是什么?
据我所知,move-constructors和move-assign必须标记为noexcept,以便编译器在例如在向量内重新分配时使用它们.
但是,是否存在任何真实情况,其中move-assign,move-construct可能实际抛出?
更新:
例如,当构造不能进行无掷移动时,具有已分配资源的类.