Преобразование наддува :: опционально в bool - PullRequest
14 голосов
/ 07 февраля 2011

Как я могу предотвратить компиляцию последней строки этого кода?

#include <boost/optional.hpp>

int main()
{
    typedef boost::optional<int> int_opt;
    int_opt opt = 0;
    bool x = opt;  // <- I do not want this to compile
}

Последняя строка не проверяет значение int, содержащееся в opt, но вместо этого компилируется как преобразование типа в bool, и, похоже, не соответствует намерениям пользователя.

Кажется, здесь уместна идиома безопасного bool?

Ответы [ 3 ]

18 голосов
/ 07 февраля 2011

Смысл boost::optional в том, чтобы включить код, подобный этому:

void func(boost::optional<int> optionalArg)
{
    if (optionalArg) {
       doSomething(*optionalArg);
    }
}

Таким образом, неявное преобразование в bool является функцией, и ее не следует запрещать компилировать.

3 голосов
/ 18 ноября 2016

Проблема, которую вы описали, имела место в старых версиях Boost. Начиная с версии 1.56 boost::optional имеет явное преобразование в bool, и код, который вы показываете, больше не компилируется (именно так, как вы хотели). Смотрите здесь .

1 голос
/ 07 февраля 2011

Если вы используете optional, вам необходимо определить, установлено ли оно, прежде чем его использовать.Это реализуется с помощью (по сути, bool) преобразования.

Я не думаю, что пользователь не хотел, что на самом деле там написано: они должны знать, что это optional ичто они проверяют его на достоверность.

Поскольку преобразование является частью boost::optional, я не знаю ни одного способа его прямого удаления.

Конечно, вы можетереализовать класс-оболочку для вашей конкретной потребности int, которая предоставляет только те части интерфейса optional, которые вам нужны, возможно, с явной функцией, проверяющей действительность.его неконстантная версия при работе с optional s, чтобы сделать явным то, что происходит.

...