【发布时间】:2020-07-23 15:38:48
【问题描述】:
我在一个项目树上运行了 clang-tidy(“现代化”模块),我一直在努力使 C++17 保持合理的最新状态。它纠正的几乎所有内容对我来说都不足为奇,除了一件事:它改变了所有这些类型的结构:
void foo(const std::string& str) {
}
.. 到这个:
void foo(std::string str) {
}
我不明白为什么。对我未经训练的眼睛来说,这意味着两件事:
- 它需要复制对象而不是仅仅传递一个引用。 (虽然我假设在某些情况下编译器可以推断出它可以在生成代码时只传递一个指针 - 但引用使其明确(恕我直言更好)。
- const 用于告诉函数体开发人员它不应该更改输入字符串,并且如果它需要修改字符串,它需要在某处存储自己的副本。
我确实看到了一个好处——通过将一个对象作为const 引用传递,它只是一个“删除常量”而不会被更改,所以我想按值传递可以解决这个问题。
为什么建议删除带有非 const 值传递的 const 引用?
【问题讨论】:
-
在您的情况下,我将采用 std::string_view 而不是常量引用。对我来说, std::string_view 取代了对常量字符串引用的需求
标签: c++ c++17 clang-tidy