相关疑难解决方法(0)

为什么重新分配矢量副本而不是移动元素?

可能重复:
如何在向量增长时强制执行移动语义?

insert,push_backemplace(_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)

c++ stdvector move-semantics c++11

28
推荐指数
3
解决办法
6493
查看次数

为什么动态检查C++ 0x的`noexcept`?

我很好奇背后的理由noexcept的C++ 0x FCD.throw(X)被弃用了,但noexcept似乎做了同样的事情.有noexcept没有在编译时未检查的原因?看起来如果静态检查这些函数它们只会在一个try块中调用抛出函数会更好.

c++ exception c++11

27
推荐指数
4
解决办法
6318
查看次数

C++移动语义和异常

在即将推出的C++ 0x标准中,当在移动构造函数中/期间抛出异常时会发生什么?

原始物体会保留吗?或者是处于未定义状态的原始对象和移动对象?语言提供的保证是什么?

c++ exception move-semantics c++11

26
推荐指数
2
解决办法
4449
查看次数

移动哪个投掷?

据我所知,move-constructors和move-assign必须标记为noexcept,以便编译器在例如在向量内重新分配时使用它们.

但是,是否存在任何真实情况,其中move-assign,move-construct可能实际抛出?

更新:

例如,当构造不能进行无掷移动时,具有已分配资源的类.

c++ exception-handling move-semantics

6
推荐指数
2
解决办法
1192
查看次数