Const Auto&用于存储函数结果,值得吗?
const auto& for storing functions results, is it worthwhile?
假设我们有一个函数,它返回一个类似std::string
:的复杂对象
std::string find_path(const std::string& filename);
是否值得将调用该方法的结果存储在const auto&
中?
void do_sth() {
//...
const auto& path = find_path(filename);
//...
}
这种方法可以防止复制/移动对象。所以这很好。但另一方面,引入了auto
来统一赋值的左侧。Herb Sutter在2014年CppCon2的演讲中提到了C++从左到右的现代风格https://www.youtube.com/watch?v=xnqTKD8uD64(39:00-45:00)。
在C++98中,将std::string
存储在常量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&
存储复杂返回对象,使用auto
存储基元,或者 - 使用
auto
来保持Herb在他的演示中提到的从左到右的现代C++风格(上面的链接)
在C++98中,将std::字符串存储在const ref中是可以的。它在C++11中怎么样?
在C++11中,将const引用绑定到临时字符串对象是可以的。它的行为仍然和以前一样。
在C++11中,从临时复制初始化的理论成本(避免这种情况是使用常量引用的优点)已经大大降低,因为移动字符串比复制便宜得多。
复制初始化的实际成本并没有随着编译器的优化而改变,因为它们无论如何都可能消除复制/移动,所以没有成本——尽管这是否可能取决于find_path
的实现方式。
如果您绝对希望避免复制/移动返回的字符串,并且不能假设复制省略,那么您必须在函数外部创建对象,并通过引用将其传递给函数。仅将引用绑定到返回值是不够的。
如果您想避免复制/移动返回的字符串,并且可以假设复制省略,那么使用正则对象和const引用一样好。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 在更改for循环的第三部分后,未使用for循环结果
- 使用++运算符会导致意外的结果
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- C++Brute Force攻击函数不会返回结果
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 算术运算的结果类似于:C浮点变量中的1/3
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 密码登录程序将永远循环并显示不正确的结果
- 如何让C++'tally up'结果并制定计划?
- 为什么这个程序的结果是3 "born"?和 4 死
- Const Auto&用于存储函数结果,值得吗?