Rvalue绑定和移动的组合

Combination of Rvalue binding and moving

本文关键字:组合 移动 绑定 Rvalue      更新时间:2023-10-16

我必须遵循一段代码,我想知道标准对它有什么规定。它是未定义的行为、定义但未指定的行为还是定义良好的行为?

using namespace std;
struct Foo {
    mutable int obj;
    Foo(Foo&&) = default;
    Foo(int arg) : obj(arg) {}
    void f() const { obj *= 2; }
};
int main()
{
    Foo&& a = Foo(5); // Binds temporary, lifetime ends with program
    const Foo& b = a; // Binds a, lifetime ends with program
    Foo c(std::move(a)); // Moves from a
    // a now in defined, but unspecified state
    b.f(); // ??
    cout << b.obj << endl; // May output 10
    return 0;
} // End of lifetime of temporary

注释以及我对标准的理解和解释是否正确?

move从值(rvalue-ref构造,自然不调用std::move)语义上看,意味着该值应该处于有效(特别是对销毁有效)但未指定的状态。

然而,C++中的move并不具有魔力。这只是应该做的,而不是语言强迫你做的。

CCD_ 4作为基元";标量";类型实例与复制它没有什么不同。

move类类型执行从源到目的地的每个组件的成员(和父)move

CCD_ 7只是表示";使用我的元素的移动构造函数";,它是int,而int的移动构造函数做。。。复制(好吧,int的move构造函数不存在,但如果存在,它就会进行复制)。

move的语义,即必须使源处于有效(最重要的是可销毁)状态,需要以合理的方式与std容器和算法交互,这也是std类型的行为方式。


所有这些都很好,但标准的支持在哪里?

move使用=default时会发生什么?在这种情况下,类最终会出现以下子句:

[类别副本]/15.3

否则,使用x 的相应基或成员直接初始化基或成员

对于直接初始化,告诉如何从int&&直接初始化int的子句是:

[dcl.init]/17.8

否则,正在初始化的对象的初始值是ini初始化器表达式的值(可能已转换)。

第二表达式CCD_ 18的值为7。a的值没有改变,因为标准不允许。

搬家不是魔法。

(引用当前标准草案n4296。)