【问题标题】:Calling an overload with pointers without allocating new memory使用指针调用重载而不分配新内存
【发布时间】:2015-03-17 23:46:39
【问题描述】:

考虑重载:

void foo(int) {std::cout << "foo(int) called.\n";}
void foo(int*) {std::cout << "foo(int*) called.\n";}
void foo(char*) {std::cout << "foo(char*) called.\n";}
void foo(bool*) {std::cout << "foo(bool*) called.\n";}

虽然

foo(int{});

将调用第一个重载,在不分配新 int* 的情况下调用第二个重载的最简洁方法是什么?比什么都好

foo(static_cast<int*>(nullptr));

我在这里遗漏了一个简单的语法吗?

【问题讨论】:

  • 和你的例子类似,foo(int*{}) 怎么样?
  • 这是我尝试的第一件事。显然是非法语法
  • 呵呵,今天学到东西了。
  • using intptr = int*; foo(intptr{}); 应该可以工作
  • 注意所有这些都分配内存(使用自动分配)

标签: c++ pointers overloading


【解决方案1】:

虽然foo(int*{}) 不起作用,而foo((int*){}) 仅适用于某些编译器,但foo((int*)0) 可能是最短、最容易理解并保证可以工作的。

【讨论】:

  • GCC 4.9.2 接受此语法,但 Visual Studio 2013 不接受。
  • @prestokeys:但我确信它接受 foo((int*)0),它完全一样,而且短了一个字符。
  • @Ben Voigt std::declval&lt;int*&gt;() 有效,并且是我正在寻找的解决方案。你为什么删除它?
  • @prestokeys:因为不应该。我刚刚读到(在标准中)它只能在未评估的情况下使用。
  • 您的权利。 VS2013 接受它,但 GCC 4.9.2 明确声明它“不得使用 declval()!”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-22
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 1970-01-01
  • 1970-01-01
  • 2019-10-23
相关资源
最近更新 更多