Mir*_*pas 5 c++ move-semantics c++11
我试图理解移动语义和C++中的完美转发为此我做了下一个简单的程序:
#include <iostream>
struct Test
{
Test(){ std::cout << "Test()" << std::endl; }
Test(Test&&){ std::cout << "Test(Test&&)" << std::endl; }
Test(const Test&){ std::cout << "Test(const Test&)" << std::endl; }
~Test(){ std::cout << "~Test()" << std::endl; }
};
Test MakeTest()
{
Test t;//output Test()
return Test(t);//output Test(const Test&)
}//output ~Test
int main()
{
std::cout << "------------------------------" << std::endl;
Test t0(MakeTest()); //How is t0 constructed!??
std::cout << "------------------------------" << std::endl;
Test t1(std::forward<Test>(MakeTest())); //output Test(Test&&) \n ~Test
std::cout << "------------------------------" << std::endl;
return 0;
}//output ~Test \n ~Test
Run Code Online (Sandbox Code Playgroud)
该程序具有以下输出(VS2013,GCC 4.8 - 调试mdoe,关闭优化):
------------------------------
Test()
Test(const Test&)
~Test()
------------------------------
Test()
Test(const Test&)
~Test()
Test(Test&&)
~Test()
------------------------------
~Test()
~Test()
Run Code Online (Sandbox Code Playgroud)
这里我不明白的是如何t0构建.我希望使用Test(Test&&)as作为返回值构造MakeTest()为未命名的临时值.
你能解释为什么它不调用我定义的3个构造函数中的任何一个吗?
csj*_*ter -1
@Angew 的评论很可能是正确的,复制/移动省略必须收费。
另一点可能是,即使 Test(t) 是临时的,它仍然是一个值,因此复制构造函数更接近。
无论如何,如果您希望确定使用移动构造函数,则可以使用 std::move()。
Test MakeTest()
{
Test t;
return std::move(Test(t));
}
Run Code Online (Sandbox Code Playgroud)
我使用过几次,因为一旦我们使用移动构造函数,构造函数中很容易出现技巧,我们确实希望被调用。
| 归档时间: |
|
| 查看次数: |
164 次 |
| 最近记录: |