C++ 返回复制的对象

C++ 返回复制的对象,c++,temporary,copy-elision,C++,Temporary,Copy Elision,在类似以下的函数中: template<class Iterator> A simple_return(Iterator it) { return *it; } A a = simple_return(my_it); 用途: 我这样问是因为,为了实现像operator+这样的重载,我广泛使用了以下模式: friend A operator+(const A& a, const A& b) { return A(a) += b; } 而不是: refer

在类似以下的函数中:

template<class Iterator>
A simple_return(Iterator it)
{
    return *it;
}

A a = simple_return(my_it); 
用途:

我这样问是因为,为了实现像
operator+
这样的重载,我广泛使用了以下模式:

friend A operator+(const A& a, const A& b)
{ return A(a) += b; }
而不是:

reference operator*() const
{
     return *--Iterator(current);
}
friend A operator+(const A& a, const A& b)
{
    A tmp(a);
    return tmp += b;
}

它的可读性不是特别强,但会使它长3行(一行中的两句话会很难看)。

由于命名返回值优化(NRVO),两种不同的
简单返回
应该产生完全相同的机器代码。因此,两者之间不应有任何实际区别


正如@cppleerner所提到的,这是在STL示例中完成的,因为前缀减量不能用于右值(例如,如果迭代器是指针)。其他部分可能也是如此。

*--迭代器(当前)
如果
迭代器是指针类型,则迭代器不起作用。@cppleener好的,很简单。如果你愿意,把它写下来作为答案。我将接受它作为有效的答案。原因已经在对问题的评论中指出。@hvd,将答案更改为提及这一点。评论是正确的,但我不认为你的答案是正确的。对于许多右值,可以使用前缀减量运算符。对于指针,它不能,但是当您处理作为类实现的迭代器时,
Iterator(current)
仍然是一个右值。只是在这个右值上,前缀减量也可能被支持。原语类型没有
这个
指针。因此,修饰符操作符需要左值来修改对象而不是值。但是,类类型的临时表虽然有右值,但有
this
指针,并且可以通过类类型的右值调用任何函数成员。我不知道所有这些都是如何用标准术语翻译的,但是原因是
操作符--()
与右值一起工作,除了指针必须与此相关。
friend A operator+(const A& a, const A& b)
{ return A(a) += b; }
friend A operator+(const A& a, const A& b)
{
    A tmp(a);
    return tmp += b;
}