
在文档提供的示例中:
std::string s; // is first zero-initialized to indeterminate value
// then default-initialized to ""如果语法是针对string s;的,为什么static T object;会出现零初始化?
为什么零初始化发生在默认初始化之前,为什么两者都被允许发生?
零初始化的影响是:
如果我初始化string array[2] = {"Test1"};怎么办?我知道数组将包含"Test1“和空字符串"”。
但根据上面的文件,
如果T是数组类型,则每个元素都是零初始化的。
数据类型是字符串,它是对象/引用类型吗?
如果T是引用类型,则什么也不做。
什么都没做?我想也许会有一个构造函数被调用。一根空的绳子肯定是什么?
发布于 2019-07-31 04:27:08
(除非另有规定,本答案中的所有声明都假定在命名空间范围内。)
如果语法是针对
string s;的,为什么static T object;会出现零初始化呢? 为什么零初始化发生在默认初始化之前,为什么两者都被允许发生?
具有静态存储持续时间的变量首先在编译时为零初始化,然后在运行时可选地动态初始化。static T object;声明一个静态存储持续时间的对象。对于一个简单的声明,如
int x;不执行动态初始化。对于更复杂的声明,比如
std::string s;零初始化一个字符串可能会导致一个无效的字符串与一个破碎的类不变。因此,动态初始化调用默认构造函数以确保对象是有效的。
如果我初始化
string array[2] = {"Test1"};怎么办?我知道数组将包含"Test1“和空字符串"”。
首先,在编译时,这两个对象为零初始化,导致可能的无效状态.然后,在运行时调用构造函数(第一个对象的const char*构造函数和第二个对象的默认构造函数),并构造有效的对象。
数据类型是
string,它是对象/引用类型吗?
std::string是对象类型而不是引用类型。
对于引用类型,什么都不做?我想也许会有一个构造函数被调用。一根空的绳子肯定是什么?
引用类型不被认为是实际的“对象”,因此没有必要指定它的零初始化语义。
发布于 2019-07-31 04:26:48
如果语法是针对
string s;的,为什么static T object;会出现零初始化呢? 为什么零初始化发生在默认初始化之前,为什么两者都被允许发生?
在链接到的页面中,定义了一个非局部变量。
非局部变量分两个阶段初始化。
在静态初始化阶段,变量使用常量初始化或零初始化进行初始化。
如果应用动态初始化,则使用动态初始化,例如对于具有适当构造函数的对象或使用在运行时可以回避的表达式进行初始化的对象。
您可以在https://en.cppreference.com上阅读有关该主题的更多内容。
什么都没做?我想也许会有一个构造函数被调用。一根空的绳子肯定是什么?
引用不能初始化为零。只能使用它将引用的对象初始化它。
https://stackoverflow.com/questions/57283036
复制相似问题