首頁 > 後端開發 > C++ > 初始化清單可以初始化 C 0x 中的 const 成員陣列嗎?

初始化清單可以初始化 C 0x 中的 const 成員陣列嗎?

Barbara Streisand
發布: 2024-11-02 16:15:29
原創
373 人瀏覽過

Can initializer lists initialize const member arrays in C  0x?

成員數組的初始化器列表:A C 0x 難題

在C 0x 中,初始化器列表的引入為初始化資料開闢了新的可能性成員。然而,當嘗試將它們與 const 成員數組一起使用時,可能會出現一個常見的誤解。

考慮以下程式碼:

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

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

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

與預期相反,此程式碼將無法使用錯誤:

<code class="text">incompatible types in assignment of ‘std::initializer_list<const int>’ to ‘const int [2]’</code>
登入後複製

問題源自於陣列成員資料是常數,而初始化列表ini 保存非常量值。為了解決這種不匹配問題,編譯器需要對初始化清單中的每個值執行 const 轉換。但是,語言規範不允許這樣做。

可變參數模板建構函數來救援

可以使用可變參數模板建構函數,而不是使用初始值設定項列表構造函數:

<code class="cpp">struct Foo {
    int x[2];
    template <typename... T>
    Foo(T... ts) : x{ts...} {}
};

int main() {
    Foo f1(1, 2);
    Foo f2{1, 2};
}</code>
登入後複製

此建構函式採用可變數量的參數,允許直接初始化陣列元素。請注意在初始化階段 {ts...} 中使用大括號初始化清單。

非常量情況

如果常數不是必需的,則另一個方法是跳過構造函數中的初始化並在函數體中填充數組:

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

    Foo(std::initializer_list<int> il) {
        std::copy(il.begin(), il.end(), x);
    }
};</code>
登入後複製

此方法失去了編譯時邊界檢查,但在某些情況下仍然是可行的選擇。

以上是初始化清單可以初始化 C 0x 中的 const 成員陣列嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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