【问题标题】:Why should I use const T& instead of const T or T&为什么我应该使用 const T& 而不是 const T 或 T&
【发布时间】:2012-08-02 01:39:10
【问题描述】:

我总是使用const T& 将类传递给函数。像这样:

void foo(const MyType& p)
{
  //...
}

但现在我很困惑,为什么不将 const TT& 传递给函数?

顺便说一下,对于像intlong longdouble这样的内置类型,为什么const Tconst T&(我记得我读过有效的 C++)

感谢您回答我的问题。

【问题讨论】:

  • 因为它们是不同的东西?参考:是或否。常量:是或否。选择你需要的,然后就可以了。

标签: c++


【解决方案1】:

您可以传递三个中的任何一个(const T、T&、const T&)。它们都有不同的含义。是否要传递无法修改的对象副本、对对象的非常量引用或对对象的 const 引用,由您决定。您选择的内容取决于代码的语义。总体而言,您可能希望选择const T& 而不是const T,以避免将值从调用者复制到此函数(节省时间和内存)。此外(根据this helpful link),只要您既不想改变 value 也不改变 state 的通过参考。这可以防止愚蠢和被忽视的编码错误,例如为了测试目的而更改字段。

有关将 const 原始类型的引用作为参数传递的问题,请参阅:C++ and QT4.5 - is passing a const int& overkill? Does pass by reference helps in signals/slots?

【讨论】:

【解决方案2】:

const T 是按值传递的(需要复制),对于类来说可能太多了,而对于内置类型来说应该没问题。

T& 是通过引用传递的,可以在函数中修改,而 const T& 不能,所以这取决于你需要做什么。

【讨论】:

    【解决方案3】:

    (我记得我读过 Effective C++)

    不,你不会,因为 Scott Meyers 不会犯这样的错误。

    const T& 是最好的选择,因为它从不涉及副本,但仍然可以采用右值。考虑

    void foo(int& p);
    void foo(const std::string s);
    int main() { 
        foo(1); // illegal!
        foo("A reaaaaaaaallllllllllllllllllllllllllllllllllllllllllly long string");
        // Nasty copy
    }
    

    如果您需要一个项目的副本,请在参数列表中创建一个(按值获取),但几乎没有理由将此值设为const。否则,请使用const T&。对于一些便宜的类型,不按价值考虑没有什么意义,因为您事先知道复制很便宜。

    【讨论】:

    • Stroustrup 本人基本上是这么说的here。请参阅我应该使用按值调用还是按引用调用?部分。当然我认为FAQ现在已经相当老了(写答案的时候,而不是FAQ上次修改的时候),现在我们也有移动构造函数,这也有点歪曲它。
    • 哦,可能不是Effective C++,抱歉。感谢您的帮助
    • @DeadMG 今天又看了一遍Effective C++,在第4章第20条找到了。你可以看图:twitter.com/abcdabcd987/status/231961897145081856/photo/1
    【解决方案4】:

    您始终通过 const 引用传递的规则过于笼统。

    通过const引用传递一般表示

    • 该方法不会修改参数
    • 该方法不能声明对参数的所有权
    • 调用者保证 参数的生命周期将比调用长

    如果你需要不同的东西,那么你应该选择其他东西而不是通过 const 引用。

    【讨论】:

      猜你喜欢
      • 2017-04-07
      • 2014-06-06
      • 2019-06-26
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-12
      • 1970-01-01
      相关资源
      最近更新 更多