如果有专门的函数和模板化的函数,为什么没有必要专门针对"std::nullptr_t"



请考虑以下代码:

#include <iostream>
using namespace std;
void fun(const char* s){
if (s == nullptr) {
puts("const char* nullptr");
} else {
printf("%sn", s);
}
}
template <typename T>
void fun(T* p){
printf("%pn", p);
}
int main() {
int a;
fun("abc"); // Resolves to fun(const char*)
fun(&a); // Specializes the template to int*
fun(nullptr); // Uses fun(const char*)??
fun(NULL); // Same as above
}

我很惊讶g++ 7.2.0不会抛出关于模棱两可的重载分辨率的错误,因为我认为nullptrNULL可以适合任何指针类型,包括模板专用的fun(int*),前提是没有专门用于std::nullptr_t的重载。

为什么fun(nullptr)fun(NULL)直接解析为fun(const char *)

std::nullptr_t

不是指针,因此它不会与函数模板中的模式匹配T*

尽管这违反直觉,但以下断言不会触发:

static_assert(std::is_pointer<std::nullptr_t>() == false);

至于NULL,它是一个实现定义的宏。如果要相信 cpp首选项,它要么是值为零的整数文本(所以不是指针),要么是类型std::nullptr_t的 prvalue,如上所述。这不是一个void*指针。

相关内容

  • 没有找到相关文章

最新更新