将boost :: optional转换为bool

时间:2011-02-07 15:57:41

标签: c++ boost type-conversion boost-optional

如何阻止此代码的最后一行编译?

#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的类型转换,并且似乎不是用户的意图。

安全布尔成语似乎与此相关吗?

3 个答案:

答案 0 :(得分:18)

boost::optional的重点是启用这样的代码:

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

因此隐式转换为bool是一项功能,不应阻止编译。

答案 1 :(得分:3)

您描述的问题曾经是旧版本Boost的情况。从1.56版本开始boost::optional显式转换为bool,您显示的代码不再编译(完全按照您想要的方式编译)。 See here

答案 2 :(得分:1)

如果您正在使用optional,那么您需要能够在使用之前确定它是否已设置。实现这种方式的方法是(有效的bool)转换。

在我看来并不是说用户不想要在那里写的是什么:他们应该知道它是optional并且他们正在检查它的有效性。

由于转换是boost::optional的内置部分,我不知道有任何方法可以直接删除它。

您当然可以为特定的int需求实现一个包装类,它只提供您想要的optional接口的部分,可能还有一个检查有效性的显式函数。

或者,在处理template<class T> inline T const* get_pointer ( optional<T> const& opt ) ;时,您可以始终使用optional或其非const版本,以明确说明发生了什么。