移动语义``this''?

发布于 2025-01-27 05:30:31 字数 663 浏览 1 评论 0原文

想象以下情况:

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元素的副本,altough sub_structure in即将被摧毁的对象。

如果我的呼叫类似于sub_structure(f(),...),我可以通过rvalue参考过载sub_structure;但是,作为类方法,我不知道该怎么做,基本上是基于*此是rvalue参考。

在不诉诸于全球功能的情况下,这种行为是否可以行为?

Imagine the following situation:

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(...);

I guess in the line marked ***, copies of the elements of data are made, altough sub_structure is called on an object that's about to be destroyed.

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.

Is such a behaviour possible without resorting to global functions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

失去的东西太少 2025-02-03 05:30:31

如果我的呼叫类似于sub_structure(f(),...),我可以通过rvalue参考来超载sub_tructure;但是,作为一种类方法,我不知道该怎么做,基本上是基于 *这是rvalue参考。

您是说价值类别过载吗?
不确定这是您的意思,但是如果正确解决问题,我会以这种方式:

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};
    } 
};

demo https:https:https: //godbolt.org/z/5c89edmkv

这绝不是详尽的,人们可以轻松地将参考返回到const *上的const *the const&amp;超负荷,在非const等上复制。

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.

Do you mean overloading on value category?
Not sure if this is what you mean, but if get your problem correctly, I'd go this way:

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};
    } 
};

Demo https://godbolt.org/z/5c89edMKv

This is by no means exhaustive, one can easily return e.g reference to const *this on the const& overload, copy on non-const etc.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文