c – 为什么std :: move返回的对象不会立即销毁

我测试了以下代码:

#include <iostream>
using namespace std;
class foo{
public:
    foo()       {cout<<"foo()"<<endl;}
    ~foo()      {cout<<"~foo()"<<endl;}
};

int main()
{
    foo f;
    move(f);
    cout<<"statement \"move(f);\" done."<<endl;
    return 0;
}

输出是:

foo()
statement "move(f);" done.
~foo()

但是,我预计:

foo()
~foo()
statement "move(f);" done.

根据函数移动的源代码:

  template<typename _Tp>
    constexpr typename std::remove_reference<_Tp>::type&&
    move(_Tp&& __t) noexcept
    { return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); }

返回的对象是正确的值,那么为什么不立即销毁它?

————————————————– —————
我想我只是混淆了rvalue和rvalue参考.
我修改了我的代码:

#include <iostream>

template<typename _Tp>
constexpr typename /**/std::remove_reference<_Tp>::type /* no && */
/**/ mymove /**/ (_Tp&& __t) noexcept
{ return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); }

using namespace std;
class foo{
public:
    foo()       {cout<<"foo() at "<<this<<endl;} /* use address to trace different objects */
    ~foo()      {cout<<"~foo() at "<<this<<endl;} /* use address to trace different objects */
};

int main()
{
    foo f;
    mymove(f);
    cout<<"statement \"mymove(f);\" done."<<endl;
    return 0;
}

现在我得到了我一直期待的东西:

foo() at 0x22fefe
~foo() at 0x22feff
statement "mymove(f);" done.
~foo() at 0x22fefe
最佳答案
从对象移动不会改变其生命周期,只会改变其当前值.你的对象foo在从main返回时被销毁,这是在你的输出之后.

此外,std :: move不会从对象移动.它只返回一个rvalue引用,其引用是对象,从而可以从对象移动.

转载注明原文:c – 为什么std :: move返回的对象不会立即销毁 - 代码日志