C++ 文字字符串和常量字符串引用参数

标签 c++

<分区>

我有两个重载函数,分别是 const std::string& 和 bool。我现在用文字字符串调用函数。 bool 版本被调用。这有点奇怪,而且确实是一个陷阱。

谁能解释一下为什么?

请参阅下面的代码。输出是

Write == 1

#include <iostream>
#include <string>

void write(const std::string& name_) {
  std::cout << "Write == " << name_ << std::endl;
}

void write(bool name_) {
  std::cout << "Write == " << name_ << std::endl;
}

int main()
{
  write("data");
}

最佳答案

问题是您要写入的参数不是类型为 std::string 的值(它不是 std::string 的字面值)而是字符数组。

不幸的是,我同意你的看法,这是一个陷阱,重载决议的规则将选择数组到 bool 值的转换,而不是转换为对字符串的 const 引用。

请注意,在 C++ 11 中有实际的 std::string 文字,我不会在这里详细介绍。

修复重载的方法是显式转换为 std::string:

write(std::string("data")) 会做正确的事情。

防止将来出现此问题。这确实是一个陷阱。

关于C++ 文字字符串和常量字符串引用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30991816/

相关文章:

c++ - QT Sqlite 无法获取行。数据库锁定

c++ - 相对于使用堆,使用带有 insert() 的 vector 作为优先级队列的开销是多少? (c++)

c++ - 字符串指针的 malloc : how it can be disastrous?

C++ Vector 给出难以置信的意外值(value)

C++ 模板限制成员构造函数

c++ - 无法从 mknod 创建的设备文件回显或 cat

c++ - 无法打开包含文件 - 'gtest.h' - 没有这样的文件或目录

c++ - 在 Cassandra 中使用回调函数

c++ - C++生产者使用者陷入僵局

c++ - WM_COPYDATA 无法正确传送我的字符串