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)
当您提供†默认构造函数和析构函数时,您使结构成为非聚合类型,因此聚合初始化是不可能的。
但是,您可以使用标准std::is_aggregate_v特征检查类型是否为聚合。(从c++17 开始)。
请参阅此处了解您的情况。它不是聚合,因为您提供了†那些构造函数。
您可以通过以下三种方式来完成这项工作:
删除构造函数,你就可以开始了。
struct option
{
std::string s;
bool b;
};
Run Code Online (Sandbox Code Playgroud)
默认结构内的构造函数(即声明†)。
struct option
{
std::string s;
bool b;
option() = default;
~option() = default;
};
Run Code Online (Sandbox Code Playgroud)
否则,您需要在struct.
struct option
{
std::string mStr;
bool mBool;
option(std::string str, bool b)
: mStr{ std::move(str) }
, mBool{ b }
{}
// other constructors...
};
Run Code Online (Sandbox Code Playgroud)
†以下帖子解释了何时构造构造函数将被default编辑,何时将其视为用户声明和用户提供的:(致谢@NathanOliver)
C++ 零初始化 - 为什么此程序中的 `b` 未初始化,而 `a` 已初始化?