唯一指针xvalue语义?为什么lambda f2的行为与lambda f1不同

Unique pointers xvalue Semantics? Why is the behavior of lambda f2 different from lambda f1?

本文关键字:lambda f1 不同 f2 语义 xvalue 为什么 唯一 指针      更新时间:2023-10-16

我想澄清我对唯一指针xvalue参数的理解

这是我为学习std::move和唯一指针而编写的示例代码。有人能解释为什么2号线崩溃,但1号线正常工作吗?在我的测试程序中,移动在lambda f2中做了什么?为什么行1即使在std::移动之后也能工作?这只是为了我的学习,而不是家庭作业问题,我对C++14和C++11 很陌生

#include <iostream>
#include <functional>
#include <memory>
void test()
{
    std::unique_ptr<int> p (new int(278));
    auto f1 = [](std::unique_ptr<int> i){std::cout << *i << std::endl;};
    auto f2 = [](std::unique_ptr<int> &&i){std::cout << *i << std::endl;};
    f2(std::move(p));
    std::cout << *p << std::endl;    //line 1
    f1(std::move(p));
    std::cout << *p << std::endl;    //line 2
}  
int main(int argc, const char * argv[]) {
    test();
    return 0;
}

第1行之所以有效,是因为std::move只是一个转换为r值的引用。实际的所有权转移通常由move构造函数或move赋值运算符来完成,这两者都不在f2中。第2行崩溃,因为在f1中按值传递参数会调用move构造函数,之后unique_ptr为空。