如何在C++右值引用成员函数中用Lambda移动捕获*this?
在C++右值引用成员函数中移动捕获*this的方法
先回顾两种已有的捕获方式:
- 移动捕获普通变量:
string s; auto f = [s = std::move(s)](){ /* do something */ };
- 复制捕获当前对象:
auto f = [*this](){ /* do something */ };
针对你提出的「右值引用成员函数中移动捕获*this」的问题,有两种直接可行的解决方式:
方法一:初始化捕获移动后的对象
利用C++11引入的初始化捕获语法,直接把*this移动到捕获的变量中:
class Obj { // ... auto method() && { return [self = std::move(*this)](){ // 这里使用self即可,它是原对象的移动构造副本 }; } // ... };
因为当前成员函数是&&限定的,说明*this是右值,std::move(*this)可以合法触发Obj的移动构造函数(只要类中定义了合法的移动构造)。
方法二:单独移动捕获成员变量(按需使用)
如果不需要捕获整个对象,只是需要移动捕获某些成员变量,可以直接针对成员变量操作:
class Obj { std::string inner_data; public: auto method() && { return [data = std::move(inner_data)](){ // 使用移动后的inner_data副本 }; } };
这种方式更灵活,但只适合不需要完整对象的场景。
注意点
- 移动捕获后,原
*this对象会进入有效但未定义的状态,所以在lambda捕获完成后,不要再在method()里操作原对象的成员,避免触发未定义行为。 - 如果类没有自定义移动构造函数,编译器会生成默认版本,但要确保类的成员都支持移动操作。
内容的提问来源于stack exchange,提问作者nullptr
相关产品推荐
相关产品推荐

