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

时间:2012-08-04 01:56:02

标签: c++

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

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

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

顺便说一下,对于内置类型,例如intlong longdouble,为什么const T优于const T& (我记得我读过 Effective C ++

感谢您回答我的问题。

4 个答案:

答案 0 :(得分:4)

你可以传递三个中的任何一个( const T,T&, const T& )。它们都有不同的含义。由您决定是否要传递无法修改的对象的副本,对象的非const引用或对象的const引用。您选择的内容取决于代码的语义。总的来说,您希望选择const T&而不是const T,以避免将值从调用者复制到此函数(节省时间和内存)。此外(根据this helpful link),只要您希望避免同时更改状态,就可以使用const T&而不是T& 传递的引用。这可以防止愚蠢和被忽视的编码错误,例如更改字段以进行测试。

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

答案 1 :(得分:0)

  

(我记得我读过有效的C ++)

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

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

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&。对于一些便宜的类型而言,没有必要按价值收取价值,因为你事先知道复制很便宜。

答案 2 :(得分:0)

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

通过const引用传递通常表示

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

如果您需要不同的东西,那么您应该选择除了通过const引用之外的其他东西。

答案 3 :(得分:0)

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

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