【问题标题】:Overloaded function with nullptr not called未调用具有 nullptr 的重载函数
【发布时间】: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 输出。通过改写和清理来更新它,而不是通过附加更多没有任何标点符号或大写字母的“编辑:”段落。

标签: c++ nullptr


【解决方案1】:

现在,您问题的确切内容实际上深陷混乱,因为您看到“未调用”的原因是您的原始代码试图流式传输空字符指针,这会设置错误标志流并阻止它再次工作,直到它被纠正。无论如何,这是答案的要点:


您不能将nullptr 分配给char* 并期望char* 神奇地转换为std::nullptr_t。你的指针仍然是char*,它的nullptr

std::nullptr_t 的好处在于给空指针文字它自己的不同类型,它不会转换为整数类型;这并不意味着您可以期望在指针具有值 0 的地方使用类型 std::nullptr_t

【讨论】:

  • 是的,我得出了这个结论。确实很遗憾,它没有,如果可能的话,它会解决很多问题...... :)
  • @slashmais C++ 有一个静态类型系统,你不能用它来查找运行时属性。
  • @AlanStokes:嗯,它并不完全是静态的,是的,你可以。只是不是这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
  • 1970-01-01
  • 2011-12-18
  • 2014-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多