【问题标题】:How do I use std::initializer_list to initialize a struct?如何使用 std::initializer_list 初始化结构?
【发布时间】:2019-04-16 15:22:54
【问题描述】:

所以我有一个结构

struct live_set_item
{
    uint32_t data_0;
    uint64_t data_1;
    uint64_t data_2;

    live_set_item(uint32_t data_0_, uint32_t data_1_, uint64_t data_2_)
        : data_0(data_0_), data_1(data_1_), data_2(data_2_) 
    {}
};

我想用这样的初始化列表进行初始化

void foo()
{
    struct live_set_item obj;
    get_new_lsi(&obj);

    if (failed_to_initialize(obj)) {
        obj = {
            .data_0 = 2000,
            .data_1 = 2001,
            .data_2 = 2002
        };
    }
}

但我不断收到来自 Clang 的此错误

test.cpp:339:21: error: no viable overloaded '='
                obj = {
                ~~~ ^ ~

test.cpp:175:16: note: candidate function (the implicit copy assignment operator) not 
viable: cannot convert initializer list argument to 'const live_set_item'
        struct live_set_item
               ^

所以我找到了this question 并尝试了一下

void operator=(const std::initializer_list<live_set_item>&) {}

但现在它告诉我移动赋值运算符无效?我的第一个论点是无效的?

test.cpp:175:16: note: candidate function (the implicit move assignment operator) not 
viable: cannot convert initializer list argument to 'live_set_item'

test.cpp:204:22: note: candidate 
function not viable: cannot convert argument of incomplete type 'void' to 
'live_set_item' for 1st argument

                void operator=(const std::initializer_list<au_live_set_item_v1>&) {}
                     ^

这就是我迷失的地方,我尝试以几种不同的方式更改赋值运算符,查看 cpp 文档中的 std::initializer 列表。没有什么是坚持。谁能告诉我我做错了什么?

【问题讨论】:

  • 为什么需要构造函数?

标签: c++ c++11 constructor clang


【解决方案1】:

这不是您要在那里使用的initializer_list;它是一个 GCC designated initializer,无论你多么努力,都无法让它在标准 C++ 中工作。

此外,您正在尝试分配,而不是初始化(尽管如果您摆脱 .data_0 = 的东西,复制分配可能就足够了)。

【讨论】:

  • “无论你怎么努力,你都不会让它在标准 C++ 中工作” C++20 中出现了指定的初始化程序。
猜你喜欢
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 2018-01-13
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
  • 2011-07-29
相关资源
最近更新 更多