5

В C++ можно ли зависеть от того, что новый bool инициализируется на false во всех случаях?Могу ли я зависеть от того, что новый bool инициализируется ложным?

bool *myBool = new bool(); 

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

(Обновленный код, чтобы отразить комментарий.)

+0

Обратите внимание, что мой код находится в шаблоне, templatization которого является bool в случае возникновения этого вопроса, но также может быть не-POD, для которого я хочу конструктор по умолчанию. – WilliamKF

ответ

6

В этом случае да; но причина довольно тонкая.

Скобки в new bool() вызывают значение-инициализации, который инициализирует его как false. Без них new bool вместо этого сделает default-initialisation, который оставляет его с неопределенным значением.

Лично я бы лучше увидел new bool(false), если это возможно, чтобы было ясно, что он должен быть инициализирован.

(Предполагается, что есть хорошая причина для использования new вообще, и даже если есть, то это должно управляться умным указателем, но это выходит за рамки этого вопроса).

ПРИМЕЧАНИЕ: это отвечает на вопрос так, как было, когда я его читаю; он был отредактирован, чтобы изменить его значение после того, как был написан другой ответ.

+0

Он изменил вопрос, ответ которого он уже знает, прочитав мой комментарий к другому ответу. – Nawaz

+0

Но я работаю с шаблоном (не указан в вопросе), поэтому я не могу явно указать ложный аргумент и вместо этого зависеть от инициализации значения для объектов POD и non-POD, для которых я хочу конструктор по умолчанию. – WilliamKF

+0

@WilliamKF: Хорошо, в этом случае нет выбора, кроме использования инициализации value. –

2

No. Там нет автоматической инициализации в C++. Ваш новый bool будет «инициализирован» тем, что было в памяти в тот момент, что, скорее всего, будет истинным (поскольку любое ненулевое значение истинно), но нет никакой гарантии в любом случае.

Возможно, вам повезет и используйте компилятор, который хорошо играет с вами, и всегда будет присваивать ложное значение новому bool, но это будет зависящим от компилятора и не основанным на каком-либо стандарте языка.

Вы должны всегда инициализировать свои переменные.

+3

Или он может сделать 'bool * b = new bool()'. – Nawaz

+0

Так что пустые аргументы заставляют его ошибочно? – WilliamKF

+1

@WilliamKF: Да.:-) Он инициализируется по умолчанию, который в этом случае означает ноль-инициализацию, что означает 'false'. – Nawaz

3

Три соответствующих типа инициализации, нулевой инициализации, инициализации по умолчанию и инициализации значения для 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 

Вы получаете нулевой инициализации для 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 

 Смежные вопросы

  • Нет связанных вопросов^_^