唯一指针xvalue语义?为什么lambda f2的行为与lambda f1不同
Unique pointers xvalue Semantics? Why is the behavior of lambda f2 different from lambda f1?
我想澄清我对唯一指针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为空。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 可组合的lambda/std::函数与std::可选
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 如何将lambda作为模板类的成员函数参数
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 在 lambda 捕获中声明的变量的类型推导
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 模板函数指针和lambda
- 两组使用lambda函数的大括号
- 使lambda不可复制/不可移动
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 将带有unique_ptr的可变 lambda 传递给 const&std::function
- AWS Lambda C++运行时权限被拒绝
- 捕获lambda中的std::数组
- 这 4 个 lambda 表达式之间有什么区别?
- 在实现文件中使用头文件的通用 lambda
- 唯一指针xvalue语义?为什么lambda f2的行为与lambda f1不同