调用运算符时,MSVC 不会执行用户定义的隐式转换为 std::nullptr_t==



考虑以下代码:

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完成。

相同的错误报告已经提交到这里。

最新更新