我正在读一本关于C++11、14和17的新特性的书。在关于move-semantics的章节中,作者以以下类为例:
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_:
//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值getData()方法,我有一个问题;这对我来说没有意义。我们返回data_,然后将data_设置为nullptr.但是这个函数已经留给return data_了。如何执行data_ = nullptr和size_ = 0?即使它们被执行,当nullptr超出作用域时,析构函数也会尝试删除DataObject(5,20)。
问题:有错误吗?还是我误解了什么?在我们离开函数之后,如何执行这两行?
发布于 2017-11-21 20:58:34
你的前提是错误的(强调我的):
引入重载方法getData(),将data_作为L-或R-值返回。
&和&&引用的对象是调用方法的对象(就像const在该位置所做的那样),而不是返回类型。这就是这个例子所展示的:
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:通常我避免在书上传播我的观点,但在这种情况下,我不得不告诉你,这是一个非常坏的例子,你应该远离那本书。
https://stackoverflow.com/questions/47422552
复制相似问题