无法将左值绑定到一个右值引用上。
在函数 foo() 中定义的 fund ,相对于 func ,在调用 bar() 时,为 str 裹上了 std::move() 。此时终于可以编译成功,可以 move const 的 str 。
在函数 foo() 中定义的 fune ,相对于 funb ,以引用的方式捕获了右值引用。在 fune 中调用 bar() ,就如同 foo() 直接调用 bar() 一样。
在函数 foo() 中调用接收一个右值引用作为参数的函数 bar_bar() 生成一个函数。在函数 bar_bar() 中用 lambda 定义的函数对象 funf ,以引用的方式捕获一个右值,并在 lambda 中访问改对象。该 lambda 作为 bar_bar() 函数生成的函数对象。 foo() 中调用 bar_bar() 时传入函数栈上定义的临时对象 stra ,并将 bar_bar() 返回的函数对象作为返回值返回。在 main() 函数中用 funcg 接收 foo() 函数返回的函数对象,并调用 funcg ,此时会发生 crash 或能看到乱码。crash 或乱码是因为,在 funf 中,访问的 str 对象实际上是 foo() 函数中定义的栈上临时对象 stra , foo() 函数调用结束之后,栈上的临时对象被释放, main() 函数中调用 funcg 实际在访问一个无效的对象,因而出现问题。
到此这篇关于C++ lambda 捕获模式与右值引用的使用的文章就介绍到这了,更多相关C++ lambda 捕获模式与右值引用内容请搜索易采站长站以前的文章或继续浏览下面的相关文章希望大家以后多多支持易采站长站!










