C++ 返回右值?或者:为什么在'return<;上调用复制构造函数;表达式>;`?

C++ 返回右值?或者:为什么在'return<;上调用复制构造函数;表达式>;`?,c++,return,copy-constructor,rvalue,C++,Return,Copy Constructor,Rvalue,我怀疑我模模糊糊地知道我所观察到的原因,但我想确认或更正,并对其进行一些解释 我有以下代码: template <class T> class C { public: C () = default; C(const C& rhs) : mem(rhs.mem) { std::cerr << "copy" << "\n"; } // does not call copy constructo

我怀疑我模模糊糊地知道我所观察到的原因,但我想确认或更正,并对其进行一些解释

我有以下代码:

template <class T>
class C
{

public:

    C () = default;

    C(const C& rhs) : mem(rhs.mem)
    {
        std::cerr << "copy" << "\n";
    }

    // does not call copy constructor twice
    // friend C operator<<(C& src, unsigned shift)
    // {
    //     std::cerr << 1 << "\n";
    //     C tmp(src);
    //     std::cerr << 2 << "\n";
    //     tmp <<= shift;
    //     std::cerr << 5 << "\n";
    //     return tmp;
    // }

    // does call copy constructor twice
    friend C operator<<(C& src, unsigned shift)
    {
        std::cerr << 1 << "\n";
        C tmp(src);
        std::cerr << 2 << "\n";
        return (tmp <<= shift);
    }

    friend C& operator<<=(C& src, unsigned shift)
    {
        std::cerr << 3 << "\n";
        src.mem <<= shift;
        std::cerr << 4 << "\n";
        return src;
    }

    T mem;
};

int main()
{
    C<int> c1;

    c1 << 3;
}
另一个的输出如下所示:

1
copy
2
3
4
copy
1
copy
2
3
4
5

我的假设是正确的,即infact
return(tmp按值返回时,必须初始化返回值。这里返回值是
C
类型的对象


return(tmp操作符)的情况下,如果要测试何时调用复制构造函数或是否调用复制构造函数,则应该使用不同的优化级别进行测试。根据编译器、编译器优化等的不同,输出可能完全不同。
tmp <<= shift;
return tmp;