c++ - 重载 char* 和 std::string 是否安全?

标签 c++

我刚刚在一本初学者书籍上读到有关重载函数的内容。 出于好奇,我想问一下在 char* 和 std::string 之间重载是否安全。

我玩了下面的代码并得到了一些结果。但我不确定这是否是未定义的行为。

void foo(std::string str) {
  cout << "This is the std::string version. " << endl;
}

void foo(char* str) {
  cout << "This is the char* version. " << endl;
}

int main(int argc, char *argv[]) {

  foo("Hello"); // result shows char* version is invoked

  std::string s = "Hello";
  foo(s); // result shows std::string version

  return 0;

}

最佳答案

是的,它是安全的,只要你让它成为const char*,而且实际上经常有用。自 C++11 以来,字符串文字无法转换为 char*(并且在此之前已弃用)。

const char* 重载将被选择用于字符串文字,因为字符串文字是 const char[N](其中 N是字符数)。重载有一种优先顺序,当多个可以工作时,将选择一个。执行数组到指针的转换被认为比构造 std::string 更匹配。

为什么重载 std::stringconst char* 会有用?例如,如果您有一个用于 std::string 的重载和一个用于 bool 的重载,则当您传递一个字符串字面量。这是因为 bool 重载仍然被认为比构造 std::string 更好。我们可以通过提供一个 const char* 重载来解决这个问题,它将击败 bool 重载,并且可以直接转发到 std::string 过载。

关于c++ - 重载 char* 和 std::string 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24662227/

相关文章:

c++ - 使用挂起的协程进行适当的清理

c++ - 使用静态链接编译 hdf5 项目

c++ - GLEW + VS2010错误

c++ - 为什么OpenCV BOW集群功能运行很慢?如何提高其性能?

c++ - 时间和基准

c++ - 为什么我的 Sprite 不显示?

c++ - 如何将字符串迭代器传递给其他函数

c# - 如何添加计算器开始菜单搜索?

c++ - linux中的定时器类

c++ - 我可以在std::find_if的并行版本中使用非平凡的可迭代迭代器吗?