成員數組的初始化器列表: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中文網其他相關文章!