最令人困擾的解析混亂:澄清歧義
在C 11 中,統一初始化器引入了一種微妙的歧義,稱為「最令人煩惱的解析」。讓我們深入研究一個示範此問題的範例:
<code class="cpp">#include <iostream> class Timer { public: Timer() {} }; int main() { auto dv = Timer(); // What is Timer() ? And what type is dv? int time_keeper(Timer()); // This is a function right? And why isn't the argument " Timer (*) ()"? return 0; }</code>
分析:
第一行:
<code class="cpp">auto dv = Timer();</code>
<code class="cpp">int time_keeper(Timer());</code>
什麼是Timer()?
<code class="cpp">#include <type_traits> struct Timer { }; int main() { int time_keeper(Timer()); static_assert( std::is_same< decltype(time_keeper), int(Timer(*)()) >::value, "This should not fire!"); }</code>Timer() 是 Timer 類別的一個不帶參數的建構子。它初始化 Timer 類型的物件。
dv 是什麼型式?
dv 使用 auto 聲明,它從初始化器推斷其類型。由於初始值設定項是 Timer 類型,因此 dv 是 Timer 類型。 第二行:這是函數嗎? 是的,這是一個函數宣告。它聲明了一個名為 time_keeper 的函數,該函數傳回一個 int 並接受一個參數。 為什麼參數不是「Timer () ()」? 這是一個特殊的情況「最令人煩惱的解析」的歧義。當一個函數作為參數傳遞給另一個函數時,它會自動衰減為指向該函數的指標。因此,在這種情況下,參數不是 Timer () (),而是 Timer()。 為了證明這一點,請考慮以下程序:程式編譯成功,確認 time_keeper 將指向函數的指標作為參數。 總之,「最令人煩惱的解析」混亂源於這樣一個事實:表達式 Timer() 可以解釋為Timer 類型的物件或指向返回 Timer 的函數的函數指標。正確的解釋取決於使用該表達式的上下文。以上是'Timer()”是函數還是物件?理解 C 11 中的「最令人煩惱的解析」。的詳細內容。更多資訊請關注PHP中文網其他相關文章!