按值传递nlohmann::json对象

后端开发 2026-07-10

一个类似的问题 通过值还是引用传递JSON对象 没有给出答案,但在评论中,Niels Lohmann本人表示:

我会尽量不要按值传递。内部实现是向量/映射/字符串/int64_t/double/bool,取决于你的类型;如果该值是嵌套的,那么它的规模会相当快地增长。

然而,我仍然感到困惑,因为 basic_json::parse 本身的代码返回按值解析的结果:

static basic_json parse(InputType&& i,
                        const parser_callback_t cb = nullptr,
                        const bool allow_exceptions = true,
                        const bool ignore_comments = false)
{
    basic_json result;
    parser(detail::input_adapter(std::forward<InputType>(i)), cb, allow_exceptions, ignore_comments).parse(true, result);
    return result;
}

此外,似乎没有用于就地解析 json 对象的API方法(就像这里的 parser 所做的那样),这意味着按值传递被认为是可以的。

你能就此问题阐明一下吗?

解决方案

parse() 函数必须按值返回。你得到的返回值是你已解析的JSON数据内部表示的唯一实例。

当你把从 parse() 得到的值(或子值)传递给其他函数时,你应当小心,除非你确实想要一个独立的副本来进行操作,否则不要进行拷贝。通常你会传递一个 const 引用,或者一个非 const 引用来引用该JSON值。

注:这不仅仅适用于json值。对于大多数未知大小的容器也是如此。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章