C++ 17では、prvalues( "anonymous temporaries")はもはやオブジェクトではありません。代わりに、オブジェクトの作成方法に関する指示です。
建設指示から一時的にインスタンス化することができますが、オブジェクトが存在しないため、が存在しません。コピー/移動の構成はありません。だからここ
Foo myfunc(Foo foo) {
return foo;
}
、関数の引数foo
はmyfunc
のprvalue戻り値に移動されます。これは概念的には「myfunc
はFoo
の作り方に関する説明を返します」と考えることができます。これらの命令がプログラムで使用されていない場合は、一時的に自動的にインスタンス化され、それらの命令が使用されます。
auto foo = myfunc(Foo());
ここで、Foo()
は値です。それは "()
コンストラクタを使用してFoo
を構築する"と言います。それは次にmyfunc
の引数を構築するために使用されます。エリシジョンは発生せず、コピーコンストラクタまたはムーブコンストラクタは呼び出されず、ただ()
となります。
これはmyfunc
の中で起こります。
myfunc
は、Foo
の正価を返します。このprvalue(別名構築命令)は、ローカル変数auto foo
を構築するために使用されます。
だから、は()
で構築され、次にauto foo
に移動されます。
戻り値への関数の引数の削除は、私が知っている限り、C++ 14やC++ 17ではサポートされていません(私は間違っている可能性があります、ここでは標準と章はありません)。しかし、return func_arg;
コンテキストで使用されると暗黙的に移動されます。
注:C++ 17を使用しているので、関数がパラメータを取らない場合はなぜまだ 'void'を置いていますか? – Rakete1111
@ Rakete1111には、その 'void'を置くために必要な標準がありましたか?私の時間がずっとずっと前にC++であったに違いない。 – user463035818
@ tobi303わからない。たぶんC++が標準化されていたのかもしれませんが、それはまだCに基づいていました。でも、わかりません。 – Rakete1111