理解C 統一初始值設定項中“最令人煩惱的解析”歧義
“最令人煩惱的解析”是指以下情況下可能出現的歧義:在C 11 中使用統一的初始化語法。當不清楚程式碼表達式是在初始化物件還是呼叫傳回物件的函數時,就會出現這種歧義。
為了說明這種歧義,請考慮以下程式碼:
<code class="cpp">#include <iostream> class Timer { public: Timer() {} }; int main() { // Case 1: Initializing an object auto dv = Timer(); // Case 2: Calling a function int time_keeper(Timer()); return 0; }</code>
情況1:初始化物件
在第一種情況下, auto dv = Timer() 初始化一個名為dv 的Timer 類型的物件。 dv 的類型被推斷為 Timer,因為我們使用 auto 來聲明它。
情況2:呼叫函數
第二種情況,int time_keeper(Timer ()) 宣告了一個名為time_keeper 的函數,該函數傳回一個int 並以一個指向傳回Timer 且不帶任何參數的函數的指標為參數。
參數不是 Timer 的原因 (*) ()是函數在作為參數傳遞時衰減為指標。因此,time_keeper 的型別其實是 int(Timer(*)())。
可以透過明確指定要初始化的變數的型別或明確宣告函數的簽章來避免這種歧義。例如:
<code class="cpp">// Explicitly specify the type of the variable auto dv: Timer = Timer(); // Explicitly declare the function's signature int time_keeper(Timer (*)());</code>
以上是C 統一初始化何時成為「最令人困擾的解析」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!