为何声明operator bool() const会使未定义的operator[]通过编译?
问题解答
疑问二:test["wut"]的调用逻辑
这段代码能编译,和Test类是否重载operator[]毫无关系,核心是C++的隐式类型转换和内置指针下标运算符的特性在起作用:
- 你的
Test类声明了无explicit修饰的operator bool() const,编译器会自动把test对象隐式转换成bool类型(这里返回true,对应整数1)。 - C++里数组/指针的下标运算符
[]是可交换的:对于指针p和整数n,p[n]等价于*(p + n),自然也等价于n[p]。 "wut"是const char*类型的字符串字面量,所以test["wut"]经过转换后,实际等价于1["wut"],也就是*(1 + "wut"),最终取到字符串"wut"的第二个字符(下标从0开始)'u'。这个字符的ASCII值非零,所以if条件为真,输出内容。
疑问一:为何声明operator bool()会让[]“看起来被重载”
根本不存在operator[]被重载的情况,只是上面的隐式转换+内置运算符特性,让代码看起来像是Test对象支持[]运算符而已。本质是编译器把Test对象转成了int(bool类型会自动提升为int),然后用这个int和字符串指针执行了内置的下标运算,和Test本身的成员函数完全无关。
如果给operator bool()加上explicit修饰,这段代码会直接编译失败——因为编译器无法再隐式将Test对象转换为bool类型,后续的指针下标运算也就无从触发了。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

