在下面的示例中,我使用boost::json解析一个json对象.

当我打印返回的boost::json::value的类型时,正如预期的那样,它是object类型.

然后我有两个在各个方面都相同的类,除了在BraceInit中我用括号初始化我的成员boost::json::value,在ParenInit中我用括号初始化我的成员boost::json::value.

使用大括号初始化会将my object转换为array,大小为1,包含我原来的object.

#include <iostream>
#include <boost/json.hpp>

namespace json = boost::json;

void print_type(const json::value& jv)
{
    switch (jv.kind())
    {
        case json::kind::object: std::cout << "object\n"; break;
        case json::kind::array: std::cout << "array\n"; break;
        default: std::cout << "other\n"; break;
    }
};

struct BraceInit
{
    BraceInit(json::value jv)
        : _jv{jv}
    {
        print_type(_jv);
    }
    json::value _jv;
};

struct ParenInit
{
    ParenInit(json::value jv)
        : _jv(jv)
    {
        print_type(_jv);
    }

    json::value _jv;
};

int main()
{
    const std::string str = R"({ "foo": "bar" })";
    const json::value jv = json::parse(str);
    print_type(jv);

    BraceInit b(jv);
    ParenInit p(jv);
    return 0;
}

Output:

object
array
object

这里发生了什么?

我的"支架初始化"是否真的没有像我预期的那样进行支架初始化,而是创建了一个大小为1的std::initializer_list

推荐答案

[class.base.init]/7

mem初始值设定项中的表达式列表或带括号的初始化列表用于初始化指定的子对象(或

11.6此处指[dcl.init],第17段规定:

初始值设定项的语义如下.目的地类型是正在创建的对象或引用的类型

(17.1)-如果初始值设定项是一个(不带括号的)带括号的初始列表或是=带括号的初始列表,则对象或引用是

11.6.4仅指[dcl.init.list].

所以,对我来说,这听起来像是_jv{jv}调用构造函数的初始化列表版本(如果存在的话),根据boost documentation,它会生成一个array.

注:C++17草案N4659中的所有项目

你可以在这里看到一个简化版本:https://godbolt.org/z/9qrf3EooY


编辑:cppreference将其简化为:

std::initializer_list对象在以下情况下自动构造:

大括号的init list用于列表初始化对象,其中相应的构造函数接受std::initializer_list参数

Json相关问答推荐

基于两个条件替换扁平化的SON中的值

无法根据vega规范中的条件设置文本 colored颜色

对面的行/列进行排序时可能出现错误

将JSON输入子数组转换为字符串顺序列表输出

Jolt变换将字段移动到数组的每个元素中

GO KaZaam转换返回意外结果

使用jq过滤复杂json对象中的数据

简单条形图和有序分类中条形图的 colored颜色 梯度

如何将具有相同 struct 的多个JSON文件中的对象数组合并成一个数组?

如何在 JSonPath 中按值查找列表中的所有元素

使用 TypeScript 接口时如何修复未定义错误?

ETCD 导出为 json 并从 base64 解码所有键/值到人类可读

如何实现一个通用的 serde_json::from_str

如何在 Perl 中将简单的哈希转换为 json?

在 Qt 4.7 中解析 JSON 的最简单方法

有什么方法可以在 elasticsearch 服务器中导入 json 文件(包含 100 个文档).?

Peewee 模型转 JSON

AJAX 将 JavaScript 字符串数组发布到 JsonResult 作为 List 总是返回 Null?

如何从 JSON 响应中提取单个值?

确保数组中的项目属性在 Json Schema 中是唯一的?