相关疑难解决方法(0)

移动物体怎么办?

标准是否准确定义了对象移动后我可以对其做什么?我曾经认为你用移动物体做的所有事情都可以破坏它,但这还不够.

例如,采用swap标准库中定义的函数模板:

template <typename T>
void swap(T& a, T& b)
{
    T c = std::move(a); // line 1
    a = std::move(b);   // line 2: assignment to moved-from object!
    b = std::move(c);   // line 3: assignment to moved-from object!
}
Run Code Online (Sandbox Code Playgroud)

显然,必须可以分配给移动的对象,否则第2行和第3行将失败.那么移动对象我还能做些什么呢?我在哪里可以找到标准中的这些细节?

(顺便说一句,为什么它T c = std::move(a);不是T c(std::move(a));第1行呢?)

c++ swap variable-assignment move-semantics c++11

136
推荐指数
2
解决办法
1万
查看次数

什么构成C++ 11中"移动"对象的有效状态?

我一直在试图解决C++ 11中的移动语义应该如何工作,而且我很难理解移动对象需要满足的条件.看看这里答案并没有真正解决我的问题,因为无法看到如何以合理的方式将它应用于pimpl对象,尽管移动语义的参数非常适合pimpls.

我的问题最简单的说明涉及pimpl习语,如下所示:

class Foo {
    std::unique_ptr<FooImpl> impl_;
public:
    // Inlining FooImpl's constructors for brevity's sake; otherwise it 
    // defeats the point.
    Foo() : impl_(new FooImpl()) {}

    Foo(const Foo & rhs) : impl_(new FooImpl(*rhs.impl_)) {}

    Foo(Foo && rhs) : impl_(std::move(rhs.impl_)) {}

    Foo & operator=(Foo rhs) 
    {
        std::swap(impl_, rhs.impl_);

        return *this;
    }

    void do_stuff () 
    {
        impl_->do_stuff;
    }
};
Run Code Online (Sandbox Code Playgroud)

现在,一旦我离开了,我该怎么办Foo?我可以安全地销毁移动的物体,我可以分配给它,这两者都绝对是至关重要的.但是,如果我尝试do_stuff使用我的Foo,它会爆炸.在我为我的定义添加移动语义之前Foo,每个人都Foo满足了它的不变性do_stuff,而现在已不再是这样了.目前似乎并没有被大量的替代品,或者说,因为(例如)将被移至距离Foo …

c++ pimpl-idiom invariants move-semantics c++11

24
推荐指数
2
解决办法
4365
查看次数

我可以调整移出的矢量的大小吗?

我有一些代码,我想绝对确保移出的代码std::vector不会留下秘密数据(考虑加密密钥管理)。在我的班级的移动构造函数中,我做了类似的事情:

X(X&& rhs): secret_vector{std::move(rhs.secret_vector)}{
    rhs.secret_vector.resize(N);
    safe_zero(rhs.secret_vector); // zero out all elements
    rhs.secret_vector.resize(0);
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我在离开秘密向量后重新使用它。我在看

重复使用移动的容器?

但我并不完全清楚我可以做到这一点(我不明白“先决条件”到底是什么)。

我的问题是:我可以调整从 std::vector 移出的大小,对其执行一些操作,然后将其大小调整回零吗?

c++ cryptography move move-semantics c++11

8
推荐指数
1
解决办法
863
查看次数