gpt4 book ai didi

c++ - clang-tidy 建议我删除 const 引用,为什么?

转载 作者:行者123 更新时间:2023-12-01 13:00:50 25 4
gpt4 key购买 nike

我在一个项目树上运行了 clang-tidy(“现代化”模块),我一直在努力保持与 C++17 保持同步。它纠正的几乎所有内容对我来说都不足为奇,除了一件事:它改变了所有这些类型的结构:

void foo(const std::string& str) {
}

..对此:
void foo(std::string str) {
}

我不明白为什么。对我未经训练的眼睛来说,这意味着两件事:
  • 它需要复制对象,而不仅仅是传递引用。 (尽管我假设在某些情况下编译器可以推断出它可以在生成代码时只传递一个指针——但是引用使它显式(恕我直言更好))。
  • const 在那里告诉函数体开发人员它不应该更改输入字符串,并且如果它需要修改字符串,它需要在某处存储自己的拷贝。

  • 不过,我确实看到了好处——只需将对象作为 const 传递引用它只是一个“删除常量”,无论如何都不会被改变,所以我猜按值传递可以解决这个问题。

    为什么建议使用非 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().



    如果多次使用构造函数参数,它甚至不会应用转换。

    所以我不认为你所有的功能都应该这样转换。

    关于c++ - clang-tidy 建议我删除 const 引用,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61147906/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com