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;