c++ - 调用方法作为 R 值

标签 c++ c++11 rvalue

我正在阅读一本关于 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(),它返回 data_ 作为 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() 方法有疑问;这对我来说没有意义。我们返回 data_ 然后我们将 data_ 设置为 nullptr...但是函数已经保留了 return data_ . data_ = nullptrsize_ = 0 怎么可能被执行?即使它们会被执行,析构函数也会在 DataObject(5,20) 超出范围时尝试删除 nullptr

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

最佳答案

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

The introduces the overloaded method getData() which returns data_ as a L- or a R-Value

&&& 指的是您调用方法的对象(就像 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

现在回答您的实际问题:

We return data_ and then we set data_ to nullptr... but the function was left already with return data_

你是完全正确的,那段代码是胡说八道。 return 之后的语句永远不会被执行。

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

关于c++ - 调用方法作为 R 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47422552/

相关文章:

c++ - 使用 lambda 作为模板参数时,这个编译器错误是什么?

c++ - 书中 "rvalue"和 "rvalue reference"的混淆

c++ - 为什么在运算符重载中允许返回构造函数?

c++ - 在 C++ 中使用回调会增加耦合吗?

c++ - 从二进制文件读取字节到 long int

c++ - 填充通过引用传递的 vector 的正确方法

c++ - std::is_constructible 是否适用于可转换为参数的参数?

c++ - shared_ptrs 的 vector 行为神秘

c++ - 右值保证了什么样的优化?

c++ - 通用引用模板类型总是评估为左值