Является ли использование void * вместо bool желательной практикой? - PullRequest
3 голосов
/ 04 февраля 2012

Подводные камни Хорстманна в C ++ затрагивает интересный момент при разговоре о потоках.Чтобы процитировать его:

Используйте преобразование в void*, а не преобразование в int или bool, чтобы реализовать объекты, дающие истинные значения.В отличие от int или bool, void* не имеет никаких законных операций, кроме == сравнения.

Как программист, я был бы озадачен, если какая-то функция вернула void*, когда я ожидаюлогическое.Хорстманн приводит пример, где использование void* вместо bool представляется целесообразным.Всегда ли это целесообразно?

1 Ответ

10 голосов
/ 04 февраля 2012

В общих обстоятельствах это не рекомендуется, а с C ++ 11 вообще не рекомендуется.

Причиной преобразования в void* была поддержка синтаксиса, подобного

std::ifstream myStream;
if (myStream) {

}
if (!myStream) {

}

Здесь преобразование в bool кажется более разумным, но приводит к таким странностям:

if (myStream == true) // ??

Преобразование в void* препятствует тому, чтобы этот код был легальным, но открывает совершенно другойбанка червей, например

delete myStream; // ??

В C ++ 11, с возможностью иметь explicit operator bool() в качестве функции-члена, этот взлом void* не рекомендуется и не должен использоваться.Не используйте эту идиому.Если вам нужно что-то, чтобы вернуть bool, пусть это вернет bool.Если вам нужен объект, который можно преобразовать в bool, используйте explicit operator bool.

Надеюсь, это поможет!

...