clang-tidy 建议我删除 const 引用,为什么?
clang-tidy suggest I remove const references, why?
I 运行 clang-tidy("modernize" 模块)在我一直试图与 C++17 保持合理同步的项目树上。它纠正的几乎所有内容对我来说都不足为奇,除了一件事:它改变了所有这些类型的结构:
void foo(const std::string& str) {
}
..为此:
void foo(std::string str) {
}
而且我不明白为什么。对于我未经训练的人来说,这意味着两件事:
- 它需要复制对象而不是仅仅传递一个引用。 (尽管我假设在某些情况下编译器可以推断出它可以在生成代码时只传递一个指针——但引用使其明确(恕我直言,这更好))。
- const 用于告诉函数体开发人员它不应该更改输入字符串,并且如果它需要修改字符串,它需要在某处存储自己的副本。
不过我确实看到了一个好处——通过将一个对象作为 const
引用传递,它只是 "remove const" 无论如何都不会被改变,所以我想按值传递会解决这个问题.
为什么建议删除具有非常量传递值的 const 引用?
here给出的理由是
With move semantics added to the language and the standard library updated with move constructors added for many types it is now interesting to take an argument directly by value, instead of by const-reference, and then copy. This check allows the compiler to take care of choosing the best way to construct the copy.
另外
The transformation is usually beneficial when the calling code passes an rvalue and assumes the move construction is a cheap operation.
但是,文档指出,唯一的替换是在以下特定情况下:
Replaces the uses of const-references constructor parameters that are copied into class fields. The parameter is then moved with std::move().
如果多次使用构造函数参数,它甚至不会应用转换。
所以我认为 所有 您的函数不应该那样转换。
I 运行 clang-tidy("modernize" 模块)在我一直试图与 C++17 保持合理同步的项目树上。它纠正的几乎所有内容对我来说都不足为奇,除了一件事:它改变了所有这些类型的结构:
void foo(const std::string& str) {
}
..为此:
void foo(std::string str) {
}
而且我不明白为什么。对于我未经训练的人来说,这意味着两件事:
- 它需要复制对象而不是仅仅传递一个引用。 (尽管我假设在某些情况下编译器可以推断出它可以在生成代码时只传递一个指针——但引用使其明确(恕我直言,这更好))。
- const 用于告诉函数体开发人员它不应该更改输入字符串,并且如果它需要修改字符串,它需要在某处存储自己的副本。
不过我确实看到了一个好处——通过将一个对象作为 const
引用传递,它只是 "remove const" 无论如何都不会被改变,所以我想按值传递会解决这个问题.
为什么建议删除具有非常量传递值的 const 引用?
here给出的理由是
With move semantics added to the language and the standard library updated with move constructors added for many types it is now interesting to take an argument directly by value, instead of by const-reference, and then copy. This check allows the compiler to take care of choosing the best way to construct the copy.
另外
The transformation is usually beneficial when the calling code passes an rvalue and assumes the move construction is a cheap operation.
但是,文档指出,唯一的替换是在以下特定情况下:
Replaces the uses of const-references constructor parameters that are copied into class fields. The parameter is then moved with std::move().
如果多次使用构造函数参数,它甚至不会应用转换。
所以我认为 所有 您的函数不应该那样转换。