首页 > 后端开发 > C++ > 如何在 C 0x 构造函数中初始化成员数组:为什么使用 `std::initializer_list` 失败以及如何解决?

如何在 C 0x 构造函数中初始化成员数组:为什么使用 `std::initializer_list` 失败以及如何解决?

Mary-Kate Olsen
发布: 2024-11-02 17:32:29
原创
492 人浏览过

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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板