是为已从中移动()的unique_ptr定义的“unique_ptr::operator bool()”

Is `unique_ptr::operator bool()` defined for a unique_ptr that has been move()d from?

本文关键字:unique ptr operator bool 定义 移动      更新时间:2023-10-16

据我所知,从标准库对象移动后,该对象处于有效但未定义的状态。但在unique_ptr的情况下,它到底有多不定义?从经验上讲,下面的代码似乎是有效的,也就是说,在我从p1移动之后,"if ( p1 )"的求值结果为false。从直觉上看,这似乎是正确的行为。但我能相信这一点吗?

#include <memory>
#include <iostream>
int main( int argc, char* argv[] )
{
    using namespace std;
    unique_ptr<int> p1 {make_unique<int>(1)};
    unique_ptr<int> p2;
    if ( p1 )
        cout << "p1 owns an object" << endl;
    if ( p2 )
        cout << "p2 owns an object" << endl;
    p2 = move(p1);
    // Is the following test valid, now that p1 has been moved from?
    if ( p1 )
        cout << "p1 owns an object" << endl;
    if ( p2 )
        cout << "p2 owns an object" << endl;
}

输出:

p1 owns an object
p2 owns an object

unique_ptr的规范明确指出,移动操作对此类指针的影响是所有权从右侧指针转移到左侧指针(20.8.1/16用于移动构造函数,20.8.1.2.3/2用于赋值)。所有权转让的概念在标准(20.8.1/4)中有明确定义,它说在这种转让之后,右手边变成nullptr

这意味着从unique_ptr移动的状态或不仅仅是有效的,它是定义的

我能相信这个吗?

是的,你可以。在std::unique_ptr上移动意味着从它转移所有权,然后operator bool肯定会返回false,因为它不拥有任何对象。