首頁 > 後端開發 > C++ > 主體

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

Patricia Arquette
發布: 2024-11-04 08:51:30
原創
324 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!