Подтвердить что ты не робот

Преобразование boost:: необязательно для bool

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

#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
}

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

Идиома безопасного bool, похоже, здесь важна?

4b9b3361

Ответ 1

Весь смысл boost::optional заключается в том, чтобы включить такой код:

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

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

Ответ 2

Если вы используете optional, тогда вам нужно будет определить, установлен ли он перед его использованием. Способ, которым это реализовано, - это преобразование (эффективно bool).

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

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

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

В качестве альтернативы вы всегда можете использовать template<class T> inline T const* get_pointer ( optional<T> const& opt ) ; или ее неконстантную версию при работе с optional, чтобы сделать ее явной, что происходит.

Ответ 3

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