考虑以下代码:
struct X { operator std::nullptr_t() const { return nullptr; } };
X x;
assert(x == nullptr);
据我所知,它应该可以工作,因为 X
可以隐式转换为 std::nullptr_t
因此 operator==
应该执行到左参数的隐式转换。这似乎是 GCC 和 Clang 中发生的事情,它们愉快地接受了代码。 CppInsights似乎证实了隐式转换确实按预期发生了。
但是,此代码无法在 MSVC 中编译并出现以下错误 (Godbolt link)
error C2676: binary '==': 'main::X' does not define this operator or a conversion to a type acceptable to the predefined operator
这段代码是无效的、特定于实现的行为,还是 MSVC 错误地拒绝了它?
最佳答案
MSVC 拒绝代码是错误的,因为程序结构良好,因为可以通过转换运算符进行隐式转换以检查 x == nullptr
。
已提交相同的错误报告 here .
关于c++ - 调用 operator== 时,MSVC 不会执行用户定义的到 std::nullptr_t 的隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73044484/