今天,我在用户定义的隐式转换运算符中遇到了一个有趣的行为。
我们来看这段代码:
struct Widget {
Widget(uint64_t) {
}
Widget(const std::string &) {
}
operator uint64_t() {
return static_cast<uint64_t>(123456789UL);
}
operator std::string() {
return std::string("Hello");
}
};
可以隐式转换为 uint64_t 或 std::string 的基本结构。
现在,尝试通过 std::cout 打印出一个 Widget 实例:
#include <iostream>
int main() {
using std::cout;
Widget w(123456);
cout << w;
}
无论出于何种原因,Widget 将始终转换为 uint64_t。起初,我希望调用是模棱两可的,并且符合标准的显式转换为 compile :
int main() {
using std::cout;
Widget w(123456);
cout << static_cast<uint64_t>(w);
}
但由于我现在忽略的原因,选择了 operator uint64_t。我试图查看 C++ 规范,但找不到任何有用的东西来回答我的问题。
谁能帮我弄清楚编译器对重载解析做了什么?