Почему библиотеки Boost возвращают вещи, «конвертируемые в« bool », а не просто возвращающие« bool »? - PullRequest
6 голосов
/ 04 ноября 2008

Несколько раз, просматривая документацию библиотеки Boost, я сталкивался с возвращаемыми значениями, помеченными как « преобразуемый в bool» (найдите на этой странице фразу «преобразуемую в bool», это около трети пути вниз). Однажды я наткнулся на косвенную ссылку на бумагу, объясняющую причину этого, но так и не смог найти упомянутую бумагу (и я больше не могу найти страницу, на которой я видел ссылку).

Может кто-нибудь объяснить, почему (и когда) вы должны возвращать что-то, что «конвертируется в bool», а не просто возвращать bool?

Ответы [ 3 ]

25 голосов
/ 04 ноября 2008

«преобразуемый в bool» означает просто все, что может быть использовано в логическом контексте (например, в условии if). Это имеет смысл в неявных преобразованиях. Представьте себе объект, который вы хотите использовать в логическом контексте, например, std::fstream

ifstream ifs("filename");
while (ifs >> token)
    cout "token " << token << " read." << endl;

Здесь ifs конвертируется в логическое значение. Ну, на самом деле это не так. Скорее, оно конвертируется во что-то, что, в свою очередь, конвертируется в bool. Это для предотвращения таких заявлений:

int b = ifs;

Причина в том, что такое утверждение, скорее всего, не предназначено, и поэтому компилятор должен его предотвратить. Возвращая «Convertible to Bool» вместо bool, это достигается потому, что два пользовательских неявных преобразования не могут быть связаны в одном выражении.

В этом контексте вы, возможно, захотите найти идиому safe bool . Крис уже упоминал об одной возможной реализации, используя void* в качестве возвращаемого типа. Обычно указатель this используется для представления true. Это то, что используется STL. Тем не менее, это, к сожалению, все еще ущербно. Было предложено несколько альтернатив (аккуратно обернутых в статье, которую я связал выше), и, насколько я знаю, они также были включены в C ++ 0x для рассмотрения. Я не знаю о текущем статусе этих предложений, однако.

11 голосов
/ 04 ноября 2008

bool с можно повысить до int с и могут участвовать в арифметических операциях. Это часто не желаемый результат, когда значение просто нужно использовать для проверки правдивости.

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

0 голосов
/ 04 ноября 2008

Может для производительности? В C / C ++ вы можете делать оператор if для чисел (0 - false, все остальное - true). Преобразование в строгий тип bool является дополнительной операцией, которая во многих случаях не потребовалась бы.

На самом деле я не использовал повышение, так что это всего лишь предположение, но мне оно кажется разумным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...