C++ 将方法作为R值调用
我正在读一本关于C++11、14和17的新特性的书。在关于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
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-ValuegetData()
方法有问题;这对我来说毫无意义。我们返回数据
,然后将数据
设置为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语句后的两行,我以前从未见过,我非常怀疑它是否会被执行(如果我错了,请更正)。