C++ 为什么unique_ptr在超出范围时不会立即销毁对象?

C++ 为什么unique_ptr在超出范围时不会立即销毁对象?,c++,C++,我有以下代码: struct C { C() {std::cout << ">>> constructor\n"; } ~C() {std::cout << ">>> destructor\n"; } }; void bar(std::unique_ptr<C>&& p) { std::cout &

我有以下代码:

struct C
{
    C()             {std::cout << ">>> constructor\n"; }
    ~C()            {std::cout << ">>> destructor\n"; }
};

void bar(std::unique_ptr<C>&& p)
{
    std::cout << "bar\n";
}

int main()
{
    auto instance = std::make_unique<C>();
    std::cout << "after construction\n";
    bar(std::move(instance));                // #1
    std::cout << "after bar\n";
    return 0;
}
为什么会这样?如何解释这种行为?

std::move实际上并不移动。它只是将其强制转换为右值引用

改变

void bar(std::unique_ptr<C>&& p)

在移动构造函数中实际执行移动。

std::move实际上不移动。它只是将其强制转换为右值引用

改变

void bar(std::unique_ptr<C>&& p)


在移动构造函数中实际执行移动。

尝试从barThan中删除(&A),尝试思考(&A),并提供有关如何使用它的额外信息尝试从barThan中删除(&A),尝试思考(&A),并提供有关如何使用itOr bar的额外信息,可以执行类似std::unique_ptr xstd::movep的操作,这也会移动,或者bar可以做一些类似std::unique_ptr xstd::movep的事情,这也会移动。
void bar(std::unique_ptr<C> p)