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);
//...
}
问题:我们应该
- 使用
const auto&
存储复杂的 return 对象,auto
存储原始对象,或
- 对所有内容使用
auto
以保持 Herb 在他的演示文稿中提到的从左到右的现代 C++ 风格(link 以上)。
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 引用一样好。
假设我们有一个函数 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);
//...
}
问题:我们应该
- 使用
const auto&
存储复杂的 return 对象,auto
存储原始对象,或 - 对所有内容使用
auto
以保持 Herb 在他的演示文稿中提到的从左到右的现代 C++ 风格(link 以上)。
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 引用一样好。