首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以R值的形式调用方法

以R值的形式调用方法
EN

Stack Overflow用户
提问于 2017-11-21 20:55:28
回答 1查看 107关注 0票数 0

我正在读一本关于C++11、14和17的新特性的书。在关于move-semantics的章节中,作者以以下类为例:

代码语言:javascript
复制
class DataObject {
public:
  DataObject(int n, int v): data_(new int[n]), size_(n) {
    std::fill(data_, data_ + size_, v);
  }
  virtual ~DataObject() {
    delete[] data_;
  }
  ... //copy constructor, assignment operator

private:
  int* data_;
  int size_;
}

现在,他介绍了重载方法getData(),它以L-或R-值的形式返回data_

代码语言:javascript
复制
//For L-Value
int* getData() const& {
  int* result(new int[size_]);
  copy(data_, data_ + size_, result);
  return result;
}

//For R-Value
int* getData() && {
  return data_;
  data_ = nullptr;
  size_ = 0;
}

以下示例将在后面展示:

代码语言:javascript
复制
DataObject do(4, 10);
int* data1 = do.getData();
int* data2 = DataObject(5, 20).getData();

对于R值getData()方法,我有一个问题;这对我来说没有意义。我们返回data_,然后将data_设置为nullptr.但是这个函数已经留给return data_了。如何执行data_ = nullptrsize_ = 0?即使它们被执行,当nullptr超出作用域时,析构函数也会尝试删除DataObject(5,20)

问题:有错误吗?还是我误解了什么?在我们离开函数之后,如何执行这两行?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-21 20:58:34

你的前提是错误的(强调我的):

引入重载方法getData(),将data_作为L-或R-值返回。

&&&引用的对象是调用方法的对象(就像const在该位置所做的那样),而不是返回类型。这就是这个例子所展示的:

代码语言:javascript
复制
DataObject do(4, 10);
int* data1 = do.getData();
//           ^ this is a l-value

int* data2 = DataObject(5, 20).getData();
//                ^ this is a r-value

现在来问你的实际问题:

我们返回data_,然后将data_设置为nullptr.但是函数已经与返回data_一起保留了。

你是完全正确的,而且那个代码是胡说八道。返回后的语句永远不会被执行。

PS:通常我避免在书上传播我的观点,但在这种情况下,我不得不告诉你,这是一个非常坏的例子,你应该远离那本书。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47422552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档