2016-03-03 113 views
4

我只是偶然发现了Evan Teran在Split a string in C++?上的回答,他在其中引用了一个向量,修改它并返回它的引用。在这种情况下返回参考是否是一种很好的风格?

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() 

有什么缺点?据我所知,返回引用的主要原因是人们可能会返回一个在返回后被破坏的局部变量的引用。这不适用于此,因为对象不是本地的,而是作为参数提供给方法。

+3

我看到这个用例返回引用没有问题。它就像'operator <<' – Garf365

+2

这是一个合理的事情,用于链接命令。例如,这种方法用于'operator <<'打印。对于函数调用而非运算符仍然有用。 – BoBTFish

回答

2

代码

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_linessplit功能。

但是,鉴于这种情况,返回对矢量的引用是有意义的。通过价值回报通常不会受益于移动语义,因此会产生一些不必要的开销。并且void的结果可能会使调用代码非常笨拙。

相关问题