我可以依赖新的bool初始化为false吗?

Wil*_*mKF 6 c++ portability boolean default-constructor language-lawyer

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

bool *myBool = new bool();

assert(false == *myBool);  // Always the case in a proper C++ implementation?
Run Code Online (Sandbox Code Playgroud)

(更新了反映评论的代码.)

Mik*_*our 8

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

new bool()原因值初始化的括号,将其初始化为false.如果没有它们,new bool则会执行默认初始化,这会使其具有未指定的值.

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

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

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


bam*_*s53 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
Run Code Online (Sandbox Code Playgroud)

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

static bool b; // b is zero-initialized
thread_local bool b2; // b2 is zero-initialized
Run Code Online (Sandbox Code Playgroud)

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

class foo {
    bool b;
};
foo f{}; // f.b is zero-initialized
thread_local foo f2; // f2.b is zero-initialized
Run Code Online (Sandbox Code Playgroud)