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;