2011-02-07 83 views
13

如何防止编译代码的最后一行?boost :: optional可选转换为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,似乎并没有为用户意图是什么。

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

+4

你是什么意思_something like_?用英文描述你想要什么。代码显然没有描述你想要的。那么我们应该怎么知道? – Oswald 2011-02-07 16:02:05

+1

你不能`boost :: optional`实现`operator!`,这就是上面最后一行编译的原因。你甚至不能从这个隐藏该操作符 - 你需要修复你的代码。 – Nim 2011-02-07 16:17:02

回答

16

boost::optional整点是使这样的代码:

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

因此隐式转换到bool是一个特性,并且不应从编译防止。

1

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

它并不在我的脑海中,后面是用户不想要那里写的是什么:他们应该知道这是一个optional,他们正在检查它的有效性。

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

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

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

1

您描述的问题曾经是旧版Boost的情况。自从1.56发布以来,boost::optional已明确转换为bool,并且您显示的代码不再编译(完全按照您的要求)。 See here