if (static_cast <bool>(x)) против if (x) - PullRequest
3 голосов
/ 02 ноября 2019

У меня есть сотрудник, который обычно выполняет явное приведение к bool в условных выражениях, например:

SomeType *ptr = /* some value */;
if (static_cast<bool>(ptr)) {
    // do something
}

Но я не смог найти вескую причину такого многословия. Есть идеи?

Редактировать: Коллега говорит, что речь идет о ясности и ясности, но я не считаю это объяснение очень убедительным. Я поставил вопрос здесь, чтобы увидеть, рекомендуют ли другие эксперты по С ++ это, и если так, возможно, появится более убедительный аргумент.

Ответы [ 3 ]

2 голосов
/ 02 ноября 2019

Вообще говоря, объективно веских причин для этого нет. Для указателей это на самом деле отрицательно полезно. Преобразование указателя в bool является четко определенной операцией в C ++ и было со времен C (и, вероятно, раньше). Это базовая идиома, которую каждый учитель C ++ должен выучить . Явное выполнение преобразования отправляет сообщение о том, что явное преобразование каким-то образом отличается от неявного контекстного преобразования, которым оно не является.

Кроме того, пользователь, который не знает, что делает if(ptr), вероятно, также не делает этого. знать, что вообще сделает преобразование указателя на bool. Так что if(static_cast<bool>(ptr)) нельзя даже отстаивать как более ясное;if(ptr != nullptr) гораздо яснее о том, что происходит с неофитом.

1 голос
/ 02 ноября 2019

if (static_cast<bool>(ptr)) полностью эквивалентно if (ptr).

Возможно, ваш коллега думает, что использование static_cast добавляет ясности к коду.

0 голосов
/ 03 ноября 2019

Начиная с C ++ 11, вы можете указать преобразование explicit bool, которое запускается только при использовании в таких ситуациях, как if (myObj) { … }, но не в таких ситуациях, как bool b = myObj;. Заявления эквивалентны, но ваш коллега, возможно, пытался предоставить «явный» характер преобразования только в синтаксисе. Подводя итог, вам не нужен static_cast<bool>(myObj), и после C ++ 11 вам обеспечена безопасность типов.

...