如何在 C++ 中将不可复制的局部变量移出 lambda
How to move non-copyable local variable out of lambda in C++?
我想实现一个简单的运行时检查宏,所以它的工作原理是:
CHECK(expr) << "Some problem!";
为此,我编写了一个简化的日志记录类:
class Log {
public:
Log() = default;
Log(const Log&) = delete;
~Log() {
cout << this << " dtor" << endl;
cout << stream_.str() << endl;
}
template <class T>
Log& operator<<(const T& info) {
cout << this << " <<" << endl;
stream_ << info;
return *this;
}
private:
stringstream stream_;
};
并让宏是:
#define CHECK(expr)
if (!(expr)) [] { /* See attempts below */ }()
现在让我们尝试实现 lambda。
尝试 #1
最简单的方法应该是:
[] {
Log log;
log << "A";
return log;
}
但是没有运气 - 复制构造函数被删除:
error: use of deleted function 'Log::Log(const Log&)'
尝试 #2
好的,让我们显式移动局部变量:
[] {
Log log;
log << "A";
return move(log);
}
嗯,还是没有运气。
尝试 #3
一个绝望的尝试,当然不应该奏效:
[]() -> Log&& {
Log log;
log << "A";
return move(log);
}
它编译甚至运行,但 operator <<
是在析构函数之后调用的:
0xbfe84064 dtor
A
0xbfe84064 <<
帮助我弄清楚从 lambda 返回变量做错了什么?
使移动构造函数default
,即
Log(Log&&) = default;
因为否则,用户提供的副本 CTOR 的存在(即使 delete
d)会禁用移动 CTOR。您还应该return log;
而不是return move(log);
,因为将调用默认的移动 ctor(因为复制 ctor 被删除)。例如,有关为什么通常应避免return move
的更多详细信息,请参阅此内容。
住在科里鲁
相关文章:
- 使用的未初始化局部变量'Quick'
- 访问类成员而不复制此变量或互斥变量
- 修复未初始化的局部变量错误
- 局部变量保留函数中的值
- 如何使用 C++ 中的继承函数访问派生类中的局部变量
- 将引用分配给局部变量,如果局部变量超出范围,它会超出范围吗?
- 简单可复制与可简单复制
- Gnuplot_i.hpp C++接口绘制局部变量而不是文件
- 我应该使我的局部变量常量还是可移动的
- C++将局部变量添加到静态向量而不复制
- C++11 是否保证 return 语句中的局部变量将被移动而不是复制?
- 如何使具有包含唯一指针的成员变量的类可复制可分配
- 当局部变量被复制到全局变量时,C++GCC优化速度会减慢
- 返回局部变量而不复制它们
- 在范围内存在不可复制的局部变量时按值捕获
- 通过复制返回局部变量 - 它是如何工作的
- 如何在 C++ 中将不可复制的局部变量移出 lambda
- 复制局部变量中的char*数组
- visual是在c++中访问不从函数外部访问的volatile局部变量的可观察行为
- [=]是否意味着所有的局部变量都将被复制?