Maë*_*son 6 c++ copy-constructor object-lifetime copy-elision c++17
如果我理解正确,从C++ 17开始,此代码现在要求不进行任何复制:
Foo myfunc(void) {
return Foo();
}
auto foo = myfunc(); // no copy
Run Code Online (Sandbox Code Playgroud)
函数参数也是如此吗?是否会在以下代码中优化副本?
Foo myfunc(Foo foo) {
return foo;
}
auto foo = myfunc(Foo()); // will there be copies?
Run Code Online (Sandbox Code Playgroud)
在C++ 17中,prvalues("匿名临时")不再是对象.相反,它们是关于如何构造对象的指令.
他们可以从实例化其建造的指令暂时的,但由于没有对象存在,没有复制/移动建设的Elid.
Foo myfunc(Foo foo) {
return foo;
}
Run Code Online (Sandbox Code Playgroud)
所以在这里,函数参数foo被移动到prvalue返回值myfunc.您可以在概念myfunc上将其视为" 返回如何制作Foo"的说明.如果程序"未使用"这些指令,则会自动实例化临时指令并使用这些指令.
auto foo = myfunc(Foo());
Run Code Online (Sandbox Code Playgroud)
所以在这里,Foo()是一个prvalue.它说" Foo使用()构造函数构造一个".然后用它来构造参数myfunc.没有省略,只调用复制构造函数或移动构造函数().
东西发生在里面myfunc.
myfunc返回类型的prvalue Foo.该prvalue(又名构造指令)用于构造局部变量auto foo.
所以这里发生的是a Foo通过构建(),然后移入auto foo.
据我所知,在C++ 14和C++ 17中不支持将函数参数省略为返回值(我可能错了,我这里没有标准的章节和章节).但是,在return func_arg;上下文中使用它们时会隐式移动它们.
| 归档时间: |
|
| 查看次数: |
620 次 |
| 最近记录: |