錯誤:將臨時物件作為引用傳遞
在C 中,嘗試將臨時物件作為非常量引用傳遞可能會遇到編譯錯誤。當函數需要引用參數並使用臨時物件呼叫時,就會發生這種情況。
例如,考慮以下程式碼:
class Foo { public: Foo(int x) {}; }; void ProcessFoo(Foo& foo) { } int main() { ProcessFoo(Foo(42)); return 0; }
此程式碼在某些編譯器上成功編譯,例如Visual Studio,但在其他(例如 GCC)上失敗並出現錯誤。此錯誤訊息通常表示右值類型的非常量引用參數的初始化無效。
解決方法
要解決這個問題,可以使用三種常見的解決方法:
建立一個臨時變數用來呼叫ProcessFoo:
Foo foo42(42); ProcessFoo(foo42);
使ProcessFoo 採用常數引用:
void ProcessFoo(const Foo& foo) { }
允許ProcessFoo 以以下方式接收Foo value:
void ProcessFoo(Foo foo) { }
C禁止將臨時物件傳遞給非常量引用,以防止無意義的操作。採用非常量引用的函數期望修改參數並將其傳回給呼叫者。傳遞臨時物件無法實現此目的,因為它無法修改和傳回。
相容性差異
原始程式碼在 Visual Studio 上編譯但在 GCC 上編譯不了的原因是可能是由於編譯器配置的差異。 Visual Studio 可能允許將臨時值傳遞給非常量參考作為最佳化或向後相容性。然而,現代 C 編譯器更喜歡嚴格執行語言語義,如 GCC 中實現的那樣。以上是為什麼在 C 中將臨時物件作為非常量參考傳遞會導致編譯錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!