繁体   English   中英

变量初始化 { } vs =

[英]Variable initialization { } vs =

好吧,我只是遇到了一个奇怪的问题。 这个例子需要 nlohmann json 库,但可能有人可以解释这一点。

#include <nlohmann/json.hpp>
using JSON = nlohmann::json;

int main(int, char **) {
    JSON json { JSON::object() };
    json["foo"] = "bar";
}

相比于:

#include <nlohmann/json.hpp>
using JSON = nlohmann::json;

int main(int, char **) {
    JSON json = JSON::object();
    json["foo"] = "bar";
}

第一个示例执行以下操作:

terminate called after throwing an instance of 'nlohmann::detail::type_error'
  what():  [json.exception.type_error.305] cannot use operator[] with a string argument with array
Aborted (core dumped)

第二个运行得很好。

唯一的区别是json初始化方式的语法。 失败的使用{}表示法,成功的使用=表示法。 我认为在这种情况下,这两种语法完全等效。 显然他们不是。

我正在使用:

$ g++ --version
g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0

有人可以解释两种初始化类型之间的区别吗? 显然,它们不是 100% 可互换的。

有人可以解释两种初始化类型之间的区别吗? 显然,它们不是 100% 可互换的。

一方面,这是正确的。 有许多不同类型的初始化,您在此处提供的两种初始化方式并不相同。

但是,按照您编写它们的方式,它们对于任何类型都不是等价的;

Type t = Type();

是使用默认构造函数初始化,而

Type t = Type { Type() };

将通过复制构造函数进行初始化,或者,如果存在,构造函数采用std::initializer_list (在 C++11 中 - 在这种情况下从 C++17 开始,将选择复制构造函数)。 后者是这里的情况; 您不是在复制对象,而是在创建一个新的JSON对象并通过std::initializer_list<JSON>将您的对象传递给它,这对于nlohmann::JSON将创建一个 JSON 数组。

第一个示例使用 列表初始化,第二个示例使用 复制初始化

所以它们是不同的,这两个链接提供了对这两种语法的完整描述。 具体来说,如果您搜索The effects of copy initialization areThe effects of an object of a T of type T are ,则比较这些列表可以得出不同之处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM