MSVC 上的 NULL 行为

Zos*_*oso 2 c++ visual-c++

我正在尝试这个代码片段

#include <cstddef>
#include <cstdio>

void f(int* ptr){
    std::printf("int*\n");
}

void f(int val){
    std::printf("int\n");
}

int main() {
    f(NULL);
}
Run Code Online (Sandbox Code Playgroud)

这在 GCC 和 CLANG 上都会出错,但 MSVC 会打印int。根据我对 的阅读,由于整型的[conv.ptr]空指针常量(实际上是NULL)可以转换为指针类型,因此编译器在选择适当的函数时应该是不明确的,因为它可以绑定到和。我确认所有这些编译器都已通过以下方式实现为整数类型intint*NULL

#if defined(_MSC_VER)
    static_assert(std::is_same<decltype(NULL), int>(), "");
#else
    static_assert(std::is_same<decltype(NULL), long>(), "");
#endif
Run Code Online (Sandbox Code Playgroud)

那么,这是 MSVC 错误还是我遗漏了某些内容并且编译器在这种情况下不会抛出错误?

编辑:我知道这nullptr是衡量空性的方法,但这个问题仅仅是出于好奇并试图理解围绕它的规范。