在这种情况下 return 引用是好的风格吗?

Is it good style to return a reference in this case?

我偶然发现了 Evan Teran 在 Split a string in C++? 上的回答,他在其中通过引用获取了一个向量,对其进行了修改,然后 return 引用了它。

std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) {
  std::stringstream ss(s);
  std::string item;
  while (std::getline(ss, item, delim)) {
    elems.push_back(item);
  }
  return elems;
}

这种风格好看吗?我看到优点是直接使用结果,比如

std::vector<std::string> vec;
unsigned int uiSize = split("ssad asda", ' ', vec).size();

而不是

std::vector<std::string> vec;
split("ssad asda", ' ', vec);
unsigned int uiSize = .size()

有什么缺点吗?据我所知,反对 returning 引用的主要原因是人们可能 return 对在 return 之后被破坏的局部变量的引用。这在这里不适用,因为对象不是本地的,而是作为参数提供给方法的。

代码

std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) {
  std::stringstream ss(s);
  std::string item;
  while (std::getline(ss, item, delim)) {
    elems.push_back(item);
  }
  return elems;
}

的命名具有误导性:它更像是一个 append_lines 而不是 split 函数。

但是鉴于此,return 对向量的引用是有意义的,是的。按值返回通常不能从移动语义中受益,因此会产生一些不必要的开销。 void 结果可能会使调用代码非常笨拙。