当对象同时提供“运算符!”和“运算符布尔”时,在表达式“!obj”中使用
When an object provides both `operator!` and `operator bool`, which is used in the expression `!obj`?
我遇到了一个我自己无法回答的问题。另外,我在谷歌和这里都没有找到答案。比如说,我想在 if 子句中"检查对象的有效性",如下所示:
MyClass myObject;
// [some code, if any]
if (!myObject)
{
// [do something]
}
让我们MyClass
class MyClass
{
public:
MyClass() { };
virtual ~MyClass() { };
bool operator!()
{
return !myBool;
};
operator bool()
{
return myBool;
};
private:
bool myBool = 0;
};
我现在的问题是:在这个 if 子句中实际使用了哪个重载运算符?无论哪种方式,结果显然都是一样的。
它将使用operator!
.
选择其参数类型与参数匹配的函数将优先于需要类型转换的函数。
你会发现operator !
被执行,因为它是最直接的分辨率。如果它改用operator bool
,那么它必须首先调用转换运算符,然后将!
分别应用于该运算符。
作为一般规则,最好避免这种情况。通常,最好只定义bool
转换,因为严格来说,这是您希望逻辑运算符执行的操作,而不是直接MyClass
。定义两者会产生一些可读性问题,并且是一种冗余代码重复的形式(这可能会导致将来的程序员错误)。
相关文章:
- 表达式中运算符的 GCC 和 ADL
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 为什么这个涉及重载运算符和隐式转换的C++表达式是不明确的
- 运算符表达式上下文中重载解析的内置运算符候选项的正确行为
- 这些重载运算符如何应用于表达式 d***b?
- 在 C 和 C++ 中,使用逗号运算符的表达式是否未定义"a = b, ++a;"?
- 运算符超载的Lambda表达式
- C++表达式中的运算符优先级
- 使用运算符>>折叠表达式
- 表达式必须具有类类型(运算符)
- C++表达式模板不明确的运算符重载
- 二元运算符"<<"不能应用于类型 "wostream" 和 "string" 的表达式
- 更改对象并将其在同一表达式中使用它是不确定的行为,但是子表达式由逗号运算符分开
- [ ] - 运算符中的加法和递增表达式
- 逗号运算符与圆括号表达式的用法示例
- 折叠表达式作为 [] 运算符的参数
- 关于解引用运算符是否在表达式中产生对象对值的定义不明确
- 读取真值表C++的逻辑运算符表达式
- 声明不能发生在条件运算符表达式内部
- 表达式"a==1 ? 1 : 0"与比较加三元运算符表达式是原子的吗?