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

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

Patricia Arquette
發布: 2024-12-05 09:07:11
原創
352 人瀏覽過

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板