[英]When should I return by T const&?
我该什么时候应该回到T const&
? 如果我不打算修改对象,我看不出它与按值返回有什么不同。 并且通过const引用返回真的只意味着没有复制。 所以什么时候返回T const&
有用。
有两个原因可以让你更喜欢按const&
而不是按值返回。
首先是语义。 一个代码,它通过const&
返回一些东西并明确告诉调用者,“这里是你要求的只读版本。如果你想永久存储它,或者对它进行更改,你有责任制作它的副本“。 此返回类型的语义非常清楚,并且易于实施。
第二是优化。 通过按值返回某些内容,可以从编译器中删除一些优化机会。 这并不是说,由价值回归是比返回低效率的const&
(事实上,在情况相反可能是真实的-考虑到返回的功能char
在64位系统上)。 它只是意味着您从编译器的优化工具箱中删除其中一个工具。 还有另一种工具可以替换它 - 即,将调用与复制省略一起内联 - 所以这可能是一种清洗。 这一切都取决于背景。
我提到“语义学”是第一个原因,因为我认为它是最重要的。 有很多变量需要优化和许多移动部件,因此通常很难知道编译器能够使用什么优化以及何时使用。 然而有一件事是certian - 人类比混乱的语义更容易理解清晰的语义。
您返回const T&
常见情况是const
getter成员函数:
T& get() { return m_some_private_member; }
const T& get() const { return m_some_private_member; }
在这种情况下,您通常不希望复制 - 您只想返回对某个对象的引用,并且为了const-correctness,您可能还需要提供一个const
getter。
当你有一个足够稳定的物体。
一个简单的案例是集合以这种方式返回内容。 有点主要职位描述。
对于nonconst和另一个常见的情况是返回你在参数中得到的东西(包括隐藏的this指针)。 这可能适用于const&以类似的方式,但要注意风险,当你的param被绑定到一个临时的,将在短时间内消失。 如果你得到&并且在更改内容后返回const并且会更好。
您可以返回对数据成员的引用,但它符合“不要泄漏您的胆量”指南。
在任何情况下,如果您返回ref,您必须向客户提供有关有效性的文档。 如果您开始编写该描述,您将首先发现它是否有意义。
另一个明显的例子是身份对象,它可以(或假设)不被复制。 有必要使用访问器,一个返回const和主流使用,另一个具有写访问权限。
由于您指定的原因: 没有复制 。
如果要返回一个大对象,则返回一个const引用比该对象的副本更有效。
不制作副本更有效,特别是对于复杂类型或在其复制构造函数中执行大量工作的类型。
所以你可以避免你被误用,如下所示吗?
class A
{
int x;
public:
int show()
{
return x;
}
A(int a)
{
x = a;
}
A const& operator+(A& inp)
{
inp.x = this->x + inp.x;
return inp;
}
};
int main()
{
A a(1),b(2),c(0),d(420);
a + b = d;
std::cout<<b.show();
}
这给出了420
作为输出。 应该将重载用作d = a + b
,但没有任何内容阻止返回的引用分配另一个对象。
如果将函数的返回类型设为A const&
返回的引用是常量,并且不能为其他任何对象分配。 因此,运算符必须仅用作d = a + b
而不允许a + b = d
等。
g ++给出了错误error: passing 'const A' as 'this' argument of 'A& A::operator=(const A&)' discards qualifiers
并有效地防止这种滥用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.