首頁 > 後端開發 > C++ > 如何在 C 0x 建構函式中初始化成員陣列:為什麼要使用 `std::initializer_list` 失敗以及如何解決?

如何在 C 0x 建構函式中初始化成員陣列:為什麼要使用 `std::initializer_list` 失敗以及如何解決?

Mary-Kate Olsen
發布: 2024-11-02 17:32:29
原創
493 人瀏覽過

How to Initialize Member Arrays in C  0x Constructors: Why Does Using `std::initializer_list` Fail and How to Resolve It?

C 0x 中的初始化器列表和成員數組

在學習C 0x 的早期階段,在嘗試使用C 0x 時,經常經常會遇到語法錯誤新功能。具體來說,當嘗試使用初始化列表在建構函數中初始化成員數組時,會出現此問題。

請考慮以下程式碼:

<code class="cpp">struct Foo
{
    int const data[2];

    Foo(std::initializer_list<int const>& ini)
    : data(ini)
    {}
};

Foo f = {1,3};</code>
登入後複製

編譯後,此程式碼會觸發以下錯誤:

incompatible types in assignment of ‘std::initializer_list<const int>&’ to ‘const int [2]’
登入後複製

要解決此錯誤,所提供的答案中推薦的方法涉及使用可變參數模板建構函數而不是初始值設定項列表構造函數。使用此方法可確保類型相容性並允許靈活地初始化成員數組:

<code class="cpp">struct foo {
    int x[2];
    template <typename... T>
    foo(T... ts) : x{ts...} {} // curly braces syntax for initializer list
};

int main() {
    foo f1(1, 2);   // compiles successfully
    foo f2{1, 2};   // also compiles
    foo f3(42);    // x[1] is zero-initialized
}</code>
登入後複製

或者,如果維護常數並不重要,您可以選擇涉及在構造函數體內填充數組的方法:

<code class="cpp">struct foo {
    int x[2]; 
    foo(std::initializer_list<int> il) {
       std::copy(il.begin(), il.end(), x);
    }
};</code>
登入後複製

雖然這種方法可能可行,但它犧牲了可變參數模板建構函式提供的編譯時邊界檢查。

以上是如何在 C 0x 建構函式中初始化成員陣列:為什麼要使用 `std::initializer_list` 失敗以及如何解決?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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