首頁 >後端開發 >C++ >為什麼我不能將臨時物件傳遞給 C 中的非常量參考?

為什麼我不能將臨時物件傳遞給 C 中的非常量參考?

DDD
DDD原創
2024-12-10 22:29:10247瀏覽

Why Can't I Pass a Temporary Object to a Non-Const Reference in C  ?

將臨時物件作為引用差異傳遞

在C 中,臨時物件只能傳遞給聲明為const、按值或聲明為const 的引用右值引用。此限制可防止無意中修改臨時變量,這通常會導致運行時錯誤。

編譯器錯誤

考慮以下程式碼:

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

void ProcessFoo(Foo& foo) {
}

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

在Linux 上和Mac,此程式碼無法透過以下方式編譯錯誤:

error: invalid initialization of non-const reference of type ‘Foo&’ from an rvalue of type ‘Foo’

此錯誤源自於嘗試將臨時Foo 物件傳遞給非常量參考參數,而 C禁止這樣做。

解決方法

要解決此問題,可以採用以下方法解決方法:

  1. 建立臨時變數:
建立臨時變數:
Foo foo42(42);
ProcessFoo(foo42);

    這裡建立了一個臨時foo42變數並透過引用傳遞。
  1. 經過Const參考:
void ProcessFoo(const Foo& foo)

    這允許由於 const 限定符而傳遞臨時物件。
  1. 以值傳遞:
void ProcessFoo(Foo foo)

以值傳遞會將暫存值複製到函數中,並規避錯誤。

Visual Studio 與 g

在這種情況下,Visual Studio 的行為與 g 不同。 MSVC 允許將臨時值傳遞給非常量引用,這可能會引入微妙的運行時問題。這種行為與 g 形成鮮明對比,g 嚴格遵守 C 標準,禁止此類做法。

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

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