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