我正在尝试这个代码片段
#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是衡量空性的方法,但这个问题仅仅是出于好奇并试图理解围绕它的规范。