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

C++ 唯一指针xvalue语义?为什么lambda f2的行为不同于lambda f1?,c++,lambda,c++14,C++,Lambda,C++14,我想澄清我对唯一指针xvalue参数的理解 这是我为学习std::move和惟一指针而编写的示例代码。有人能解释为什么line2崩溃而line1工作吗?在我的测试程序中,移动在lambda f2中做了什么,为什么即使在std::move之后,line1仍然工作?这只是为了我的学习,不是家庭作业问题,我对C++14和C++11非常陌生 #include <iostream> #include <functional> #include <memory> voi

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

这是我为学习std::move和惟一指针而编写的示例代码。有人能解释为什么line2崩溃而line1工作吗?在我的测试程序中,移动在lambda f2中做了什么,为什么即使在std::move之后,line1仍然工作?这只是为了我的学习,不是家庭作业问题,我对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;
}
#包括
#包括
#包括
无效测试()
{
std::unique_ptr p(新int(278));

自动f1=[](标准::唯一的\u ptr i){std::cout第1行之所以有效,是因为std::move只是一个转换为r值的引用。实际的所有权转移通常由move构造函数或move赋值操作符完成,这两个操作符都不在f2中。第2行崩溃是因为在f1中按值传递参数调用move构造函数,之后unique_ptr为空。

添加了编辑,但没有合并mpile因为我没有添加头文件,所以我正在粘贴Xcode 7.2版的全部代码。是的,很抱歉这是一个输入错误。我很抱歉Apple LLVM 7.0,我更正了endl中的输入错误。谢谢您的帮助