为什么在用花括号初始化结构时会出错?

Ash*_*Ray 4 c++ initialization curly-braces c++11 c++17

我正在使用以下代码并出现错误。我不明白为什么我会收到这个错误。

prog.cpp: In function ‘int main()’:
prog.cpp:15:44: error: could not convert ‘{"foo", true}’ from 
                       ‘<brace-enclosed initializer list>’ to ‘option’
                       option x[] = {{"foo", true},{"bar", false}};
                                            ^
prog.cpp:15:44: error: could not convert ‘{"bar", false}’ from 
                       ‘<brace-enclosed initializer list>’ o ‘option’
Run Code Online (Sandbox Code Playgroud)

编码

#include <iostream>
#include <string>
 
struct option
{
    option();
    ~option();
 
    std::string s;
    bool b;
};
 
option::option() = default;
option::~option() = default;

int main()
{
    option x[] = {{"foo", true},{"bar", false}};
}
Run Code Online (Sandbox Code Playgroud)

JeJ*_*eJo 6

当您提供默认构造函数和析构函数时,您使结构成为非聚合类型,因此聚合初始化是不可能的。

但是,您可以使用标准std::is_aggregate_v特征检查类型是否为聚合。(从)。

请参阅此处了解您的情况。它不是聚合,因为您提供了那些构造函数。

您可以通过以下三种方式来完成这项工作:


以下帖子解释了何时构造构造函数将被default编辑,何时将其视为用户声明用户提供的:(致谢@NathanOliver

C++ 零初始化 - 为什么此程序中的 `b` 未初始化,而 `a` 已初始化?

  • 当在类中将构造函数声明为默认构造函数时,它被视为用户声明的构造函数。当在类外部默认它时,它是用户提供的构造函数。根据 C++ 的版本,如果它是聚合或不是聚合,将会产生影响。请参阅:/sf/ask/3804508011/#54350350 (5认同)
  • @JeJo,但这一个是,并且它的成员明确默认:https://godbolt.org/z/o6q-Z7 (2认同)