14

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

#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's 包含的 int 值,而是编译为类型转换为 bool,并且似乎不是用户想要的。

安全布尔成语似乎在这里相关?

4

3 回答 3

19

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

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

所以隐式转换bool是一个特性,不应该被阻止编译。

于 2011-02-07T16:11:38.173 回答
3

您描述的问题曾经是旧版本的 Boost 的情况。自 1.56 版本以来,您显示的代码boost::optional已显式转换为bool不再编译(正是您想要的方式)。见这里

于 2016-11-18T14:55:25.130 回答
1

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

我并不认为用户不想要那里实际写的内容:他们应该知道这是一个optional并且他们正在检查它的有效性。

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

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

或者,您可以在使用 s 时始终使用template<class T> inline T const* get_pointer ( optional<T> const& opt ) ;或其非常量版本,optional以明确正在发生的事情。

于 2011-02-07T16:19:50.260 回答