6

在 C++ 中,我可以依赖一个新的 bool 在所有情况下都初始化为 false 吗?

bool *myBool = new bool();

assert(false == *myBool);  // Always the case in a proper C++ implementation?

(更新代码以反映评论。)

4

3 回答 3

8

在这种情况下,是的;但原因很微妙。

括号中的new bool()原因value-initialisation,将其初始化为false. 没有它们,new bool将改为执行default-initialisation,这将使其具有未指定的值。

就个人而言,我宁愿看看new bool(false)是否可能,以明确它应该被初始化。

(这是假设有充分的理由使用new;即使有,它也应该由智能指针管理——但这超出了这个问题的范围)。

注意:这回答了我阅读时的问题;在写完另一个答案后,它已被编辑以改变其含义。

于 2012-06-28T15:15:52.483 回答
5

bool 的三种相关初始化、零初始化、默认初始化和值初始化分别意味着 bool 被初始化为 false,bool 具有不确定值,bool 被初始化为 false。

所以你只需要确保你得到零或值初始化。如果在没有指定初始化程序的情况下初始化具有自动或动态存储持续时间的对象,那么您将获得默认初始化。要获得值初始化,您需要一个空的初始化程序,或者(){}

bool b{}; // b is value-initialized
bool *b2 = new bool{}; // *b2 is value-initialized

class foo {
    bool b;
    foo() : b() {}
};
foo f; // // f.b is value-initialized

对于具有静态或线程本地存储持续时间且没有初始化程序的布尔值,您将获得零初始化。

static bool b; // b is zero-initialized
thread_local bool b2; // b2 is zero-initialized

获得零初始化的另一种情况是,如果 bool 是没有用户提供的构造函数的类的成员,并且隐式默认构造函数是微不足道的,并且类实例是零初始化或值初始化的。

class foo {
    bool b;
};
foo f{}; // f.b is zero-initialized
thread_local foo f2; // f2.b is zero-initialized
于 2012-06-28T15:32:25.307 回答
2

不,C++ 中没有自动初始化。您的新 bool 将被“初始化”为当时内存中的任何内容,这更有可能是真的(因为任何非零值都是真的),但不能保证任何一种方式。

您可能会很幸运并使用与您配合得很好的编译器,并且总是将 false 值分配给新的布尔值,但这将取决于编译器,而不是基于任何语言标准。

您应该始终初始化变量。

于 2012-06-28T14:57:22.360 回答