考虑以下代码:
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)
错误C2676: binary '==': 'main::X'未定义此操作符或未定义到预定义操作符可接受的类型的转换
这个代码是无效的,是实现特定的行为,还是MSVC拒绝它是错误的?
MSVC拒绝代码是错误的,因为程序是良好的,通过转换操作符的隐式转换可以为检查x == nullptr
完成。
相同的错误报告已经提交到这里。