以值從函數傳回類別的物件
考慮從函數傳回類別的物件的情況:值。在這種情況下,傳回的物件通常被視為左值,這意味著它在記憶體中具有名稱和位址。但是,某些情況可能會導致傳回的物件被視為右值,即沒有名稱或位址的臨時物件。
隱式移動規則
C 定義了一個按值傳回物件時可能會應用的隱式移動規則。此規則規定,如果滿足以下條件:
在這種情況下,將呼叫移動建構子而不是複製建構子。此行為旨在透過避免不必要的複製來優化效能。
範例1
在此範例中,傳回的物件i 是左值,因此複製建構子test( const test& z) 被呼叫:
<code class="cpp">class test { public: test(int y) { printf("test(int y)\n"); } test() { printf("test()\n"); } test(const test& z) { printf("test(const test&z)\n"); } }; test Some_thing() { test i; return i; }</code>
輸出:
test() test(const test&z)
範例2
但是,在以下範例中,傳回的物件i 被視為xvalue,並且呼叫移動建構子test(test&& s),因為該物件是臨時的並且移動建構函式是可行的:
<code class="cpp">class test { public: test(int y) { printf("test(int y)\n"); } test() { printf("test()\n"); } test(test&& s) { printf("test(test&& s)\n"); } }; test Some_thing() { test i; return i; }</code>
輸出:
test() test(test&& s)
範例3
如果未提供或明確刪除移動構造函數,則無法應用隱式移動規則,程式將無法編譯:
<code class="cpp">class test { public: test(test&& z) = delete; test(int y) { printf("test(int y)\n"); } test() { printf("test()\n"); } test(const test& z) { printf("test(const test&z)\n"); } }; test Some_thing() { test i; return i; }</code>
結論
當按值傳回物件時,在特定條件下可能會套用隱式移動規則,導致呼叫移動建構函式。了解這種行為對於優化程式碼和防止編譯錯誤至關重要。
以上是按值返回物件何時觸發移動建構函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!