我正在阅读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;?
答案 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不是你期望得到的。