【发布时间】:2020-10-20 02:07:41
【问题描述】:
我正在使用以下代码并出现错误。我不明白为什么会出现此错误。
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’
代码
#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}};
}
【问题讨论】:
-
只需删除默认构造函数和析构函数,或者添加一个带有两个参数的构造函数。
-
您编译的 C++ 版本是什么?每个版本的聚合规则都发生了变化,因此很重要。
-
IMO,我认为如果没有提供两个参数构造函数,大括号会减少
option类的封装。为什么用户必须知道有两个成员变量可以这样设置?我可以理解像vector<int>这样的东西,你知道你使用int来填充对象,但是option?提供适当的构造函数,使option由两个值组成,object的构造函数计算出如何设置这些值。
标签: c++ c++11 initialization c++17 curly-braces