const auto& 用于存储函数结果,值得吗?

const auto& for storing functions results, is it worthwhile?

假设我们有一个函数 return 是一个像 std::string 这样的复杂对象:

std::string find_path(const std::string& filename);

将调用该方法的结果存储在 const auto& 中是否值得?

void do_sth() {
   //...
   const auto& path = find_path(filename);
   //...
} 

这种方法会阻止 copying/moving 对象。所以这很好。但另一方面,引入了 auto 来统一赋值的左侧。 Herb Sutter 在 CppCon2014 的演讲中提到了 C++ 从左到右的现代风格 https://www.youtube.com/watch?v=xnqTKD8uD64 (39:00-45:00).

在 C++98 中,将 std::string 存储在 const ref 中很好。在 C++11 中如何?

更新 (2016-07-27 2:10 GMT+0):

抱歉,我的问题不准确。我的意思是编码风格 - 添加 const & 还是只保留 auto 更好,让编译器做任何它想做的事。

更新示例:

unsigned int getTimout() { /* ... */ }

int getDepth() { /* ... */ }

std::string find_path(const std::string& filename,
                      unsigned int timeout,
                      int depth) { /* ... */ } 

void open(const std::string& path) { /* ... */ }

两种方法:

void do_sth() {
   //...
   auto timeout = getTimeout();
   auto depth = getDepth();
   const auto& path = find_path(filename, timeout, depth);
   open(path)
   //...
} 

void do_sth() {
   //...
   auto timeout = getTimeout();
   auto depth = getDepth();
   auto path = find_path(filename, timeout, depth);
   open(path);
   //...
}

问题:我们应该

In C++98 storing the std::string at const ref was fine. How is it in C++11?

在 C++11 中,将 const 引用绑定到临时字符串对象没有问题。它仍然具有与以前相同的行为。

在 C++11 中,从临时复制初始化的理论成本(避免这种情况是使用 const 引用的优势)已大大降低,因为移动字符串比复制便宜得多。

复制初始化的实际成本并没有随着编译器的优化而改变,因为它们可能会忽略 copy/move,所以没有成本 - 尽管这是否可能取决于 find_path 已实施。


如果您绝对想避免 copying/moving returned 字符串并且不能假设复制省略,那么您必须在函数外部创建对象,并通过引用将其传递给函数。绑定对 return 值的引用是不够的。

如果您想避免 copying/moving returned 字符串并且可以假定复制省略,那么使用常规对象与 const 引用一样好。