如何阻止此代码的最后一行编译?
#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的类型转换,并且似乎不是用户的意图。
安全布尔成语似乎与此相关吗?
答案 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版本,以明确说明发生了什么。