首頁 >後端開發 >C++ >按值返回物件何時觸發移動建構函數?

按值返回物件何時觸發移動建構函數?

Patricia Arquette
Patricia Arquette原創
2024-11-04 08:51:30445瀏覽

When Does Returning an Object by Value Trigger a Move Constructor?

以值從函數傳回類別的物件

考慮從函數傳回類別的物件的情況:值。在這種情況下,傳回的物件通常被視為左值,這意味著它在記憶體中具有名稱和位址。但是,某些情況可能會導致傳回的物件被視為右值,即沒有名稱或位址的臨時物件。

隱式移動規則

C 定義了一個按值傳回物件時可能會應用的隱式移動規則。此規則規定,如果滿足以下條件:

  • 傳回的表達式是 xvalue(表示不是左值的臨時物件的表達式)。
  • 傳回的物件具有移動建構子。
  • 移動建構子是可存取的。

在這種情況下,將呼叫移動建構子而不是複製建構子。此行為旨在透過避免不必要的複製來優化效能。

範例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&amp; z) { printf("test(const test&amp;z)\n"); }
};
test Some_thing() {
    test i;
    return i;
}</code>

輸出:

test()
test(const test&amp;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&amp;&amp; s) { printf("test(test&amp;&amp; s)\n"); }
};
test Some_thing() {
    test i;
    return i;
}</code>

輸出:

test()
test(test&amp;&amp; s)

範例3

如果未提供或明確刪除移動構造函數,則無法應用隱式移動規則,程式將無法編譯:

<code class="cpp">class test {
public:
    test(test&amp;&amp; z) = delete;
    test(int y) { printf("test(int y)\n"); }
    test() { printf("test()\n"); }
    test(const test&amp; z) { printf("test(const test&amp;z)\n"); }
};
test Some_thing() {
    test i;
    return i;
}</code>

結論

當按值傳回物件時,在特定條件下可能會套用隱式移動規則,導致呼叫移動建構函式。了解這種行為對於優化程式碼和防止編譯錯誤至關重要。

以上是按值返回物件何時觸發移動建構函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn