C++ 如何将不可复制的局部变量移出C++;?
我想实现一个简单的运行时检查宏,它的工作原理如下:C++ 如何将不可复制的局部变量移出C++;?,c++,c++11,lambda,move-semantics,C++,C++11,Lambda,Move Semantics,我想实现一个简单的运行时检查宏,它的工作原理如下: CHECK(expr) << "Some problem!"; 现在,让我们尝试实现lambda 尝试#1 最简单的方法应该是: [] { Log log; log << "A"; return log; } 尝试#2 好的,让我们显式地移动局部变量: [] { Log log; log << "A"; return move(log); } []{ 日志; log使移动构造函
CHECK(expr) << "Some problem!";
现在,让我们尝试实现lambda
尝试#1 最简单的方法应该是:
[] {
Log log;
log << "A";
return log;
}
尝试#2
好的,让我们显式地移动局部变量:
[] {
Log log;
log << "A";
return move(log);
}
[]{
日志;
log使移动构造函数成为默认值,即
Log(Log&&) = default;
因为除此之外,用户提供的复制ctor(即使delete
d)的存在。您还应该return log;
而不是return move(log);
,因为默认的移动ctor将被调用(因为复制ctor已被删除)。有关通常应避免return move
的原因的更多详细信息,请参阅例如
我真的应该避免从函数(包括lambda表达式)返回局部变量。在您的例子中-只要#定义检查(e)if(!(e))Log{@PiotrNycz这对我来说不是一个好的变体,因为我想打印一个堆栈跟踪和一条用户提供的消息-这就是为什么我在lambda中使用Log
来做一些事情。一点都不成问题。你可以创建一个打印堆栈跟踪的对象-比如Log{}
error: use of deleted function 'Log::Log(const Log&)'
[] {
Log log;
log << "A";
return move(log);
}
[]() -> Log&& {
Log log;
log << "A";
return move(log);
}
0xbfe84064 dtor
A
0xbfe84064 <<
Log(Log&&) = default;