移动 `this` 的语义?

move semantics for `this`?

想象一下以下情况:

class C {
  public:
  C(std::vector<int> data): data(data) {}
  C sub_structure(std::vector<size_t> indices){
    std::vector<int> result;
    for(auto i : indices)
      result.push_back(data[i]); // ***
    return C(result);
  }
  std::vector<int> data;
};
C f(){
  ...
}
...
C c = f().sub_structure(...);

我猜在标记为 *** 的行中,制作了 data 元素的副本,尽管 sub_structure 是在一个即将被销毁的对象上调用的。

如果我的调用类似于 sub_structure(f(), ...),我可以通过右值引用重载 sub_structure;但是,作为 class 方法,我不知道该怎么做,主要是基于 if *this 是否是右值引用。

如果不求助于全局函数,这种行为是否可能?

If my call was something like sub_structure(f(), ...), I could overload sub_structure by rvalue reference; however, as a class method, I'm not aware how to do that, basically based on if *this is an rvalue reference.

您的意思是在 值类别 上超载? 不确定这是不是你的意思,但如果你的问题正确,我会这样做:

struct S
{
    std::vector<int> data;
    S doStuff() &&
    {
        std::cout << "rvalue\n";
        return {std::move(data)};
    }

    S doStuff() const&
    {
        std::cout << "const lvalue\n";
        return {data};
    } 
};

演示 https://godbolt.org/z/5c89edMKv

这绝不是详尽无遗的,可以很容易地 return 例如在 const& 重载上引用 const *this,在 non-const 上复制等