首页  >  文章  >  后端开发  >  初始化列表可以初始化 C 0x 中的 const 成员数组吗?

初始化列表可以初始化 C 0x 中的 const 成员数组吗?

Barbara Streisand
Barbara Streisand原创
2024-11-02 16:15:29282浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn