【问题标题】:Can I depend upon a new bool being initialized to false?我可以依赖一个新的布尔值被初始化为假吗?
【发布时间】:2012-06-28 14:55:55
【问题描述】:

在 C++ 中,我可以依赖在所有情况下都将新布尔值初始化为 false 吗?

bool *myBool = new bool();

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

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

【问题讨论】:

  • 请注意,我的代码在一个模板中,在这个问题的情况下,它的模板化是 bool,但也可能是非 POD,我想要默认构造函数。

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


【解决方案1】:

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

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

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】:

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

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

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

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

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

    【讨论】:

    • 在阅读了我对另一个答案的评论后,他更改了他已经知道答案的问题。
    • 但我正在使用模板(问题中未显示),因此我无法明确提供错误参数,而是依赖于我想要的 POD 和非 POD 对象的值初始化默认构造函数。
    • @WilliamKF:好的,在这种情况下,别无选择,只能使用值初始化。
    【解决方案3】:

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

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

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

    【讨论】:

    • 或者,他可以做bool *b = new bool()
    • 那么空的 args 强制它为假?
    • @WilliamKF:是的。 :-) 它是默认初始化的,在这种情况下意味着零初始化,这意味着false
    • @WilliamKF:现在,编辑后的问题是多余的。这对你来说不再是一个问题,因为你已经知道答案了!! (您应该恢复到以前的答案,以便此答案有效)。
    • 但是在一个类上它总是默认初始化,但是对于内置你必须专门这样做?
    猜你喜欢
    • 2019-04-18
    • 2012-07-08
    • 1970-01-01
    • 2012-02-13
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多