【发布时间】:2018-02-02 07:51:55
【问题描述】:
考虑以下代码:
#include <iostream>
using namespace std;
void fun(const char* s){
if (s == nullptr) {
puts("const char* nullptr");
} else {
printf("%s\n", s);
}
}
template <typename T>
void fun(T* p){
printf("%p\n", 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 确实 not 抛出关于模糊重载解析的错误,因为我认为 nullptr 和 NULL 可以放入 any 指针类型,包括从模板专门化的fun(int*),前提是没有专门针对std::nullptr_t 的重载。
为什么fun(nullptr)和fun(NULL)会直接解析为fun(const char *)?
【问题讨论】:
-
@Someprogrammerdude 感谢格式化帮助。
-
这个是相关的,但可能离你的问题有点太远了,不是骗子:stackoverflow.com/questions/10291405/…
-
请在if语句中添加return语句,否则
s == nullptr时行为未定义 -
@krzaq 添加。谢谢。
-
因为
T无法推断;应该是什么?
标签: c++ null language-lawyer overload-resolution nullptr