You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 00:25:11