为什么我应该使用 const T& 而不是 const T 或 T&

Why should I use const T& instead of const T or T&

本文关键字:const 为什么 我应该      更新时间:2023-10-16

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

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

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

顺便说一句,对于内置类型,如intlong longdouble,为什么const Tconst T&

更好(我记得我在Effective C++中读过)

谢谢你回答我的问题。

您可以传递这三个值中的任何一个(常量T、T&、const T&)。它们都有不同的含义。由您决定是要传递一个无法修改的对象副本,还是传递一个对该对象的非常数引用,或是传递一个对此对象的常量引用。选择什么取决于代码的语义。总的来说,您应该选择const T&而不是const T,以避免将值从调用方复制到此函数(节省时间和内存)。此外(根据这个有用的链接),每当您希望不更改传递引用的状态时,您都希望使用const T&而不是T&。这可以防止愚蠢和被忽视的编码错误,例如出于测试目的更改字段。

关于将对const基元类型的引用作为参数传递的问题,请参见:C++和QT4.5-正在传递const int&过度杀戮?通过参考是否有助于信号/插槽?

const T是通过值传递的(需要复制),这对于一个类来说可能太多了,而对于内置类型来说应该是可以的。

T&是通过引用传递的,可以在常量T&不能,所以这取决于你需要做什么。

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

不,你没有,因为斯科特·迈耶斯不会犯这样的错误。

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&。对于一些廉价的类型,没有必要不按价值计价,因为你事先就知道复制是便宜的。

您总是通过const引用传递的规则过于笼统。

通过常量引用通常表示

  • 该方法不会修改参数
  • 该方法可能不会声称拥有该论点的所有权
  • 呼叫方保证参数的生存期将比调用更长

如果您需要不同的东西,那么您应该选择不同于通过const引用传递的东西。

相关文章: