Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将方法作为R值调用_C++_C++11_Rvalue - Fatal编程技术网

C++ 将方法作为R值调用

C++ 将方法作为R值调用,c++,c++11,rvalue,C++,C++11,Rvalue,我正在读一本关于C++11、14和17的新特性的书。在关于move-语义的章节中,作者使用了以下类作为示例: 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 con

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

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-值:

//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;
}
随后将显示以下示例:

DataObject do(4, 10);
int* data1 = do.getData();
int* data2 = DataObject(5, 20).getData();
我对R-Value
getData()
方法有问题;这对我来说毫无意义。我们返回
数据
,然后将
数据
设置为
nullptr
。。。但是该函数已经保留了
返回数据
。如何执行
data=nullptr
size=0
?即使执行它们,当
DataObject(5,20)
超出范围时,析构函数也会尝试删除
nullptr

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

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

引入了重载方法getData(),该方法以 L值或R值

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

DataObject do(4, 10);
int* data1 = do.getData();
//           ^ this is a l-value

int* data2 = DataObject(5, 20).getData();
//                ^ this is a r-value
现在谈谈你的实际问题:

我们返回数据,然后将数据设置为nullptr。。。但是功能 已留下返回数据_

你是完全正确的,那代码是胡说八道。返回后的语句不可能执行

PS:通常我避免在书上散布我的观点,但在这种情况下,我必须告诉你这是一个非常糟糕的例子,你应该远离那本书。

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

引入了重载方法getData(),该方法以 L值或R值

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

DataObject do(4, 10);
int* data1 = do.getData();
//           ^ this is a l-value

int* data2 = DataObject(5, 20).getData();
//                ^ this is a r-value
现在谈谈你的实际问题:

我们返回数据,然后将数据设置为nullptr。。。但是功能 已留下返回数据_

你是完全正确的,那代码是胡说八道。返回后的语句不可能执行


PS:通常我会避免在书上散布我的观点,但在这种情况下,我必须告诉你,这是一个非常糟糕的例子,你应该远离那本书。

我不认为OP是在问这个问题。他在问返回语句后的两行是如何执行的。@PhotometricStereo-hm我想你是对的,实际上我不确定我是否理解了这个问题;)这也是有用的信息,因为OP误解了ref-qualifiers@M.M是的,我编辑是为了澄清我的误解,希望也是这样OPs@tobi303怎么样
classdataobject:publicstd::vector{}:)但说真的,有太多的事情需要解决,我唯一有效的建议就是扔掉这本书。我不认为这是OP的要求。他在问返回语句后的两行是如何执行的。@PhotometricStereo-hm我想你是对的,实际上我不确定我是否理解了这个问题;)这也是有用的信息,因为OP误解了ref-qualifiers@M.M是的,我编辑是为了澄清我的误解,希望也是这样OPs@tobi303怎么样
classdataobject:publicstd::vector{}:)但说真的,有太多的事情需要解决,我唯一有效的建议就是扔掉这本书。根据你所发布的内容,这本书看起来很糟糕。@tobi303回答了你的一个误解。另外,您的问题与移动语义无关。关于return语句后的两行,我以前从未见过,我高度怀疑它是否会被执行(如果我错了,请更正)。这似乎是一本基于您所发布内容的糟糕的书@tobi303回答了您的一个误解。另外,您的问题与移动语义无关。关于return语句后的两行,我以前从未见过,我非常怀疑它是否会被执行(如果我错了,请更正)。