2014-02-25 46 views
0

考虑下面的代码实现被调用。重载逻辑非运算符VS布尔类型转换操作符

但是,如果operator!()实现被注释掉,在所有3个语句中,operator bool()被调用。

我明白这种情况发生的原因,但我担心的是,重载逻辑NOT运算符(!)似乎错过了真值评估语义的一半,而bool类型转换运算符似乎很好地覆盖了它们。

我是否错过了某些东西,或者应该让逻辑NOT运算符的重载变得不受bool类型转换的支持?

+0

我看到你要去的地方,但是当'if(t )'没有! – chris

+0

@chris,完全同意,这就是为什么我猜测重载'operator!'应该是不鼓励的。你不会说吗? – imreal

+0

我不能说我可以想到任何有用的直接超负荷从我的头顶。我相信你可以在Boost中找到各种*不直接的,但是每个运营商都是这样。 – chris

回答

2

在C++ 11中,您可以简单地重载explicit operator bool()。没有理由超载operator!,除非你想让它做不同的事 - 如果你认为你想要的话,你应该再想一想。

从历史上看,重载operator bool会打开大门,隐式转换为任何数字类型,这可能会导致混淆,含糊和细微的错误;所以最好不要这样做。超载operator!是一种允许在条件中使用的简单方法,无需打开门,如果您不想陷入safe bool idiom。 (这个链接仅仅是为了历史利益;由于有明确的转换运算符,所以成语is obsolete in C++11。)