最令人煩惱的解析:解開C 11 中的歧義
C 11 中「最令人煩惱的解析」歧義使用統一初始化器時會出現,如以下程式碼片段所示:
<code class="cpp">#include <iostream> class Timer { public: Timer() {} }; int main() { auto dv = Timer(); // Ambiguity: Object or function call? int time_keeper(Timer()); // Ambiguity: Pointer or call? return 0; }</code>
理解第一個表達式(auto dv = Timer())
在第一個表達式中,auto 關鍵字意味著dv 的型別是從等號(=) 右邊的初始值設定項推斷出來的。初始化程序是對不帶參數的 Timer 建構函數的調用,它會傳回一個 Timer 物件。因此,dv 是 Timer 類型的物件。
理解第二個表達式(int time_keeper(Timer()))
在第二個表達式中,出現歧義是因為編譯者無法確定Timer () 是函數呼叫還是透過引用傳遞的Timer 類型的物件。
但是,因為函數在作為參數傳遞時會衰減為指針,所以 time_keeper 的真實類型是 int(Timer(*)()),它解決了有利於函數指針解釋的歧義。
以上是最令人煩惱的解析:Timer() - 物件還是函數呼叫?的詳細內容。更多資訊請關注PHP中文網其他相關文章!