0
考虑下面的代码实现被调用。重载逻辑非运算符VS布尔类型转换操作符
但是,如果operator!()
实现被注释掉,在所有3个语句中,operator bool()
被调用。
我明白这种情况发生的原因,但我担心的是,重载逻辑NOT运算符(!)似乎错过了真值评估语义的一半,而bool
类型转换运算符似乎很好地覆盖了它们。
我是否错过了某些东西,或者应该让逻辑NOT运算符的重载变得不受bool类型转换的支持?
考虑下面的代码实现被调用。重载逻辑非运算符VS布尔类型转换操作符
但是,如果operator!()
实现被注释掉,在所有3个语句中,operator bool()
被调用。
我明白这种情况发生的原因,但我担心的是,重载逻辑NOT运算符(!)似乎错过了真值评估语义的一半,而bool
类型转换运算符似乎很好地覆盖了它们。
我是否错过了某些东西,或者应该让逻辑NOT运算符的重载变得不受bool类型转换的支持?
在C++ 11中,您可以简单地重载explicit operator bool()
。没有理由超载operator!
,除非你想让它做不同的事 - 如果你认为你想要的话,你应该再想一想。
从历史上看,重载operator bool
会打开大门,隐式转换为任何数字类型,这可能会导致混淆,含糊和细微的错误;所以最好不要这样做。超载operator!
是一种允许在条件中使用的简单方法,无需打开门,如果您不想陷入safe bool idiom。 (这个链接仅仅是为了历史利益;由于有明确的转换运算符,所以成语is obsolete in C++11。)
我看到你要去的地方,但是当'if(t )'没有! – chris
@chris,完全同意,这就是为什么我猜测重载'operator!'应该是不鼓励的。你不会说吗? – imreal
我不能说我可以想到任何有用的直接超负荷从我的头顶。我相信你可以在Boost中找到各种*不直接的,但是每个运营商都是这样。 – chris