c++ 形参callback加上const修饰符的神坑

示例代码

template <typename Callback>
void read_input(const std::string& prompt, const Callback& cb)
{
	std::thread([prompt, cb]()
	{
		std::cout << prompt << ": ";
		std::cout.flush();
		std::string line;
		std::getline(std::cin, line);
		cb(std::move(line));
	}).detach();
}

struct no_copy {
	no_copy() = default;
	no_copy(no_copy&&) = default;
	no_copy& operator=(no_copy&&) = default;
	no_copy(const no_copy&) = delete;
	no_copy& operator=(const no_copy&) = delete;
};

no_copy nc;
read_input("input", [nc = std::move(nc)](std::string) {

});

坑点

  1. 上述 代码首先编译不过
  2. 尝试调用no_copy的移动构造,实际会变成调用no_copy的拷贝构造
  3. 如果no_copy 和 read_input都是第三方库定义的,那意味着什么呢?你至少需要修改一处第三方库代码
    • no_copy 改为可以拷贝构造
    • read_input的回调移除const

不修改三方库代码,如何解决

std::share_ptr<no_copy>

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值