在C++ 17中,prvalues(「匿名臨時對象」)不再是對象。相反,它們是關於如何構建對象的說明。
他們可以從他們的施工說明中實例化臨時工,但由於沒有對象那裏有,所以沒有複製/移動的構造要刪除。
Foo myfunc(Foo foo) {
return foo;
}
所以在這裏,函數參數foo
移入的myfunc
的prvalue返回值。您可以將此概念視爲「myfunc
返回有關如何生成Foo
的說明」。如果這些指令是您的程序「未使用」,則會自動實例化一個臨時指令並使用這些指令。
auto foo = myfunc(Foo());
所以這裏Foo()
是一個prvalue。它說「使用()
構造函數構造Foo
」。然後用它來構造myfunc
的參數。沒有發生刪除,沒有複製構造函數或移動構造函數被調用,只是()
。
然後發生在myfunc
裏面的東西。
myfunc
返回類型Foo
的預估值。這個prvalue(又名施工指令)用於構造局部變量auto foo
。
因此,這裏發生的是Foo
通過()
構建,然後移動到auto foo
。我知道(我可能是錯的,我沒有這裏的標準章節和經文),C++ 14和C++ 17都不支持函數參數的刪除。但是,在return func_arg;
上下文中使用時,它們將被隱式移動。
注意:您正在使用C++ 17,那麼如果函數不帶參數,爲什麼還要放置'void'? – Rakete1111
@ Rakete1111是否有任何標準,需要把這個'void'?必須早在我的時間之前用C++ – user463035818
@ tobi303我不知道。可能在C++被標準化之前,當它仍然基於C但是我不知道。 – Rakete1111