【发布时间】:2014-07-30 08:25:52
【问题描述】:
我有以下几点:
void func(const char *p) { std::cout << p << "\n"; }
void func(std::nullptr_t p) { std::cout << "<null>\n"; }
int main()
{
func("test");
char *p=nullptr;
func(p);
func(nullptr);
return 0;
}
func("test") 总是被调用。带有func(p) 的评论,func(nullptr) 被调用,但是当func(p) 没有被评论时,它们都不会被调用。为什么不?为什么func(p) with p==nullptr 不调用func(nullptr),而是调用func(const char*)?
[编辑]
根据回复,我的结论是 func(...) 是根据参数的类型调用的,p 的类型为 char*,将 p 的值设置为 nullptr 不会更改类型,也不会更改该 func (char*) 被调用 - 正如接受的答案所解释的那样。
【问题讨论】:
-
能否修改为不尝试使用空指针
func(p)使用空指针,即未定义行为。当你做出改变时会发生什么?见ideone.com/gSNG6m -
@DaveS:不知道我是否明白你的意思,但如果 p 指向一个有效的 c 字符串,一切正常。
-
@slashmais 没错。编译器必须在编译时决定调用哪个版本的
func,因此不可能基于参数变量的当前值——仅基于其静态类型。 -
请更新您的问题,因为它不再是内部一致的。在所有情况下,您都将获得所有三个函数调用的输出;问题是,what 输出。通过改写和清理来更新它,而不是通过附加更多没有任何标点符号或大写字母的“编辑:”段落。