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

时间:2012-06-28 14:55:56

标签: c++ boolean portability language-lawyer default-constructor

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

bool *myBool = new bool();

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

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

3 个答案:

答案 0 :(得分:8)

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

new bool()中的括号导致值初始化,将其初始化为false。如果没有它们,new bool将改为执行默认初始化,这会留下未指定的值。

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

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

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

答案 1 :(得分:3)

bool的三种初始化,零初始化,默认初始化和值初始化分别表示bool初始化为false,bool具有不确定值,并且bool初始化为假。

因此,您只需确保获得零或值初始化。如果初始化具有自动或动态存储持续时间的对象而未指定初始化程序,则会获得默认初始化。要获得值初始化,您需要一个空的初始化程序,(){}

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

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

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

答案 2 :(得分:2)

没有。 C ++中没有自动初始化。你的新bool将被“初始化”到当时内存中的任何内容,这更可能是真的(因为任何非零值都是真的),但无论如何都无法保证。

你可能会很幸运并使用一个与你相配的编译器,并且总是会给新的bool分配一个假值,但这将取决于编译器,而不是基于任何语言标准。

您应始终初始化您的变量。