首頁 >後端開發 >C++ >為什麼在 C 中將臨時物件傳遞給非常量參考失敗?

為什麼在 C 中將臨時物件傳遞給非常量參考失敗?

Patricia Arquette
Patricia Arquette原創
2024-12-05 09:07:11372瀏覽

Why Does Passing a Temporary Object to a Non-Const Reference Fail in C  ?

在 C 中將臨時物件作為引用傳遞

在 C 中,如下所示的最小程式碼片段可能會導致 Linux 和 Mac上的編譯錯誤平台:

class Foo
{
public:
    Foo(int x) {}
};

void ProcessFoo(Foo& foo)
{
}

int main()
{
    ProcessFoo(Foo(42));
    return 0;
}

編譯錯誤:

newfile.cpp: In function ‘int main()’:
newfile.cpp:23:23: error: invalid initialization of non-const reference of type ‘Foo&’ from an rvalue of type ‘Foo’
     ProcessFoo(Foo(42));
                       ^
newfile.cpp:14:6: note: in passing argument 1 of ‘void ProcessFoo(Foo&)’
 void ProcessFoo(Foo& foo)
編譯錯誤:

發生錯誤的原因:

依設計, C禁止將臨時物件傳遞給非常量引用參數。此限制旨在防止潛在的誤解和錯誤。當函數宣告非常量引用參數時,它表示其意圖修改該物件並將其傳回給呼叫者。將臨時參數傳遞給此類參數是不合邏輯的,因為一旦函數返回,它將被銷毀。

解決方法:

    要解決此編譯錯誤,請考慮以下解決方法:
  • 建立一個臨時變數:
建立一個在將臨時物件傳遞給函數之前保存臨時物件的非臨時變數:
Foo foo42(42);
ProcessFoo(foo42);
  • 使用常數參考:
修改函數以使用常數參考參數:
void ProcessFoo(const Foo& foo)
  • 經過值:
允許函數將物件作為值參數:
void ProcessFoo(Foo foo)

為什麼MSVC允許它:

不清楚為什麼 Microsoft Visual Studio (MSVC) 允許編譯此程式碼,而 g 則不允許。在這方面,MSVC 對 C 標準可能有不同的解釋。通常建議遵循標準以確保不同編譯器之間的行為一致。

以上是為什麼在 C 中將臨時物件傳遞給非常量參考失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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