使用常量引用作为返回类型

时间:2014-10-23 09:33:26

标签: c++ reference const

我正在阅读Meyer的Effective C ++,第一部分是函数定义:

template<class T>
inline const T& max(const T& a, const T& b)
{ return a > b ? a : b; }

为什么不返回T?为何选择const T&amp;?

3 个答案:

答案 0 :(得分:2)

如果T是大型或复杂类型,那么您可能不希望将其复制的成本按值返回。如果它不可复制,则根本无法按值返回。

返回引用会给调用者提供复制或不复制的选项;虽然(如评论中所述)如果你在调用函数的语句的末尾之后保持引用,如果任何一个参数是临时的,你需要小心。

答案 1 :(得分:0)

参数为const T &,因此该函数返回其中一个参数,这正是max函数应该执行的操作。没有理由返回副本。

答案 2 :(得分:0)

至少有两个原因。

创建将返回的临时对象可以是一个常量操作。

另一个原因是你有时需要访问其中一个参数的左值。考虑例如代码

#include <iostream>
#include <algorithm>

class A
{
private:
    static size_t count; 
    size_t mID;
public:
    A() : mID( ++count ) {}
    A( const A & ) : mID( ++count ) {}
    size_t getID() const { return mID; }
};

bool operator <( const A &a1, const A &a2 )
{
    return a1.getID() < a2.getID();
}

size_t A::count;

inline A my_max( const A &a, const A &b )
{ 
    return a < b ? b : a; 
}

int main() 
{
    A one;
    A two;

    std::cout << std::max( one, two ).getID() << std::endl;
    std::cout << my_max( one, two ).getID() << std::endl;

    return 0;
}

输出

2
3

我认为3不是你期望得到的。