gpt4 book ai didi

c++ - 右值绑定(bind)和移动的结合

转载 作者:搜寻专家 更新时间:2023-10-31 00:33:30 25 4
gpt4 key购买 nike

我必须遵循一段代码,我想知道标准是怎么说的。是未定义的行为、已定义但未指定的行为还是定义明确的行为?

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 从一个值(右值引用构造,而不是调用 std::move,自然地)语义上意味着该值应该在一个有效的(具体来说,有效销毁)但未指定状态。

但是,C++ 中的move 并没有魔法。这正是您应该做的,而不是语言强制您做的。

移动原始“标量”类型实例与复制它没有什么不同。

moveing class types 对每个组件从源到目标进行成员智能(和父智能)移动

=default 只是表示“使用我的元素的移动构造函数”,它是一个int,而int 的移动构造函数做...一个拷贝(好吧,int 的移动构造函数不存在,但如果它存在,它会做一个拷贝)。

move 的语义含义,您必须将源保持在有效(最重要的是可销毁)状态,需要与 std 容器和算法进行交互合理的方式,也是 std 类型的行为方式。


一切都很好,但是标准支持在哪里?

当您使用=default移动时会发生什么,在这种情况下,一个类以这个子句结束:

[class.copy]/15.3

otherwise, the base or member is direct-initialized with the corresponding base or member of x

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

[dcl.init]/17.8

Otherwise, the initial value of the object being initialized is the (possibly converted) value of the ini-tializer expression.

第二个表达式的值 int a = 7; std::move(a); 为 7。a 的值未更改,因为标准不允许。

移动不是魔法。

(引自 n4296,当前标准草案。)

关于c++ - 右值绑定(bind)和移动的结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28457832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com