gpt4 book ai didi

c++11 - C++ : For which objects, 是 "moved"意味着超过 "staying valid"?

转载 作者:行者123 更新时间:2023-12-01 04:50:55 30 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Which std types are guaranteed to be empty/null after being used as arg in move constructor

(2 个回答)


4年前关闭。




鉴于 ab属于 T 类型,我们有 move 构造( T b(move(a)); )或 move 分配( b = move(a) )。在什么情况下我们知道a的值是多少将会?

我唯一确定的就是 unique_ptr ,其中a将成为一个空指针。这对 shared_ptr 也有保证吗? ?标准是否保证其他任何类别的已知值?

最佳答案

标准库类型

从标准 N4296,§17.6.3.1,让我们 rvT 类型的右值,
在表 20 中,MoveConstructible 要求和表 22 MoveAssignable 要求。

手术后:

T(rv);
T u =rv;
u = rv;

rv’s state is unspecified [ Note:rv must still meet the requirements of the library component that is using it. The operations listed in those requirements must work as specified whether rv has been moved from or not. — end note ]



这意味着至少您 move 的对象仍处于有效状态,并且可以用作其类型的任何对象。但作为库范围的要求,仅此而已。您必须阅读特定的文档。

对于 shared_ptr 特别是:
shared_ptr(shared_ptr&& r) noexcept;
template<class Y> shared_ptr(shared_ptr<Y>&& r) noexcept;

Remark: The second constructor shall not participate in overload resolution unless Y* is convertible to T*.

Effects: Move-constructs a shared_ptr instance from r. Postconditions: *this shall contain the old value of r. r shall be empty. r.get() == nullptr.



基本类型和简单的可复制

move 的对象应该保持不变。我正在寻找标准中的确认...

其他类型

至少类的程序员应该确保该类的对象在 move 后是可破坏的!

关于c++11 - C++ : For which objects, 是 "moved"意味着超过 "staying valid"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41140170/

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