- 主题:关于lambda, move的语法问题
有个项目,简化成下列问题。
#include <iostream>
#include <functional>
using namespace std;
class Test {
public:
Test(int a):a_(a){}
~Test(){}
Test(const Test&) = delete;
Test& operator=(const Test&) = delete;
Test(Test&& o) = default;
Test& operator=(Test&& o) = default;
int value(){ return a_;}
private:
int a_;
};
void Doit(const std::function<Test()>& f){
std::cout<<f().value();
}
int main()
{
cout<<"Hello World"<<endl;
Doit([](){return Test(3);}); //成功
Test t(2);
Doit([tt = std::move(t)](){ return std::move(tt); }); // 无法编译
return 0;
}
main.cpp:36:58: error: use of deleted function ‘Test::Test(const Test&)’
Doit([tt=std::move(t)](){ return std::move(tt); });
当然,如果改成Doit([&](){ return std::move(t); });可以编译,但是我无法用&,因为真正的程序和promise相关,前面定义的变量在执行一个promise之后无法再抓住t,所以我觉得得move。(或者copy,但是这个类不能copy)。
--
FROM 72.199.121.*
问了一下chatgpt,供参考
【 在 bihai 的大作中提到: 】
: 有个项目,简化成下列问题。
: #include <iostream>
: #include <functional>
: ...................
--
FROM 8.219.174.*
传递给std::function的functor必须是CopyConstructible的。C++ 23里改了这点,弄了个std::move_only_function
https://stackoverflow.com/questions/33436336/capture-stdpromise-in-a-lambda-c14
这点上C++不如Rust,Rust的lambda加个move关键字就完事。
【 在 littleSram 的大作中提到: 】
: 问了一下chatgpt,供参考
: [upload=1][/upload][upload=2][/upload][upload=3][/upload]
--
修改:z16166 FROM 114.241.225.*
FROM 114.241.225.*
你把你的DoIt改成template
不要用std function
【 在 bihai 的大作中提到: 】
: 有个项目,简化成下列问题。
: #include <iostream>
: #include <functional>
: ...................
--
FROM 67.186.83.*
什么意思
【 在 littleSram 的大作中提到: 】
: 我一直觉得c++能成为年度语言
: 新标准的复杂度功不可没
--
FROM 223.104.213.*
开个玩笑,可能需要不断的搜索
就好像Python一样,Python2和Python3搜两边
「TIOBE 编程社区指数」是一种衡量编程语言流行度的标准,由成立于 2000 年 10 月位于荷兰埃因霍温的 TIOBE Software BV 创建和维护。 该指数是根据网络搜索引擎对含有该语言名称的查询结果的数量计算出来的。该指数涵盖了 Google、百度、维基百科和 YouTube 的搜索结果。
【 在 shyman2016 的大作中提到: 】
: 什么意思
--
FROM 114.249.18.*
有这么复杂么?明明是你自己写lambda习惯不好
你自己不写lambda的返回类型,系统识别出来,capture by move的lambda返回的是Test,default capture的lambda返回的是Test&
都是最基本的东西,搞得这么复杂。
chatgpt给你一个解决方案,但是并不是你自己的问题所在
【 在 littleSram 的大作中提到: 】
: 问了一下chatgpt,供参考
: [upload=1][/upload][upload=2][/upload][upload=3][/upload]
--
FROM 115.193.175.*
大哥,开个玩笑啊
【 在 ziqin 的大作中提到: 】
: 有这么复杂么?明明是你自己写lambda习惯不好
: 你自己不写lambda的返回类型,系统识别出来,capture by move的lambda返回的是Test,default capture的lambda返回的是Test&
: 都是最基本的东西,搞得这么复杂。
: ...................
--
FROM 114.249.18.*