首頁 > 後端開發 > C++ > C 統一初始化何時成為「最令人困擾的解析」?

C 統一初始化何時成為「最令人困擾的解析」?

DDD
發布: 2024-11-01 21:37:29
原創
1054 人瀏覽過

When Does C   Uniform Initialization Become the

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板