成员数组的初始化器列表: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中文网其他相关文章!