这些类型的初始化有什么区别?

What is the difference between these types of initialization?

在 C++ 中,我可以通过多种方式创建和初始化变量:

int x = 0;
int x(0);
int x = int(0);
int x = int(); // same as zero

但是例如在声明像这样的非原始数据类型时,会出现某种错误。

string s = "";
string s("");
string s = string("");
string s = string(); // gives an error

这些类型的初始化之间有什么区别?为什么最后一种类型适用于 int 而不适用于 string?

它们在功能上是等价的。 这是一个包含详细信息的漂亮页面 https://en.cppreference.com/w/cpp/language/initialization

int x(0); // direct initialization

// These three are copy initialization with copy elision
int x = 0;
int x = int(0);
int x = int();

/// not initialization!!! declaration of function
int x();

对于字符串情况类似,虽然你也可以根据你在初始化时给出的参数选择不同的构造函数。