C++字面量字符串和const字符串引用参数

8
我有两个重载函数,一个是带有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");
}

3
const char [5]bool有一个标准的转换顺序,即数组到指针的转换,然后是布尔转换,因此这种转换比用户定义的转换要好。 - Kerrek SB
2
投票重新开启,因为这个问题主要涉及重载决策 - Cheers and hth. - Alf
我认为这个问题在重复的被接受的答案中间间接地得到了回答... - DigitalNinja
2
我现在觉得我的回答可能不太准确,因为我很累并且头疼,但简而言之,内置的转换比如指针 -> bool 比用户定义的转换比如指针 -> std::string 更好。如果必要的话,你可以通过定义一个函数模板来绕过它,该模板将委托给命名类型特定的函数。 - Cheers and hth. - Alf
@Cheersandhth.-Alf 我明白,但对我来说,将其转换为 const std::string& 更自然,特别是它是一个字面值。感谢您的回答。 - WeidongLian
@WeidongLian Kerrek已经解释了为什么不会发生这种情况。将std::string转换为用户定义的转换,它不会被选择为标准转换序列。添加另一个重载 - void write(char const *name_)来解决您的问题。 - Praetorian
1个回答

3
问题在于你的write参数不是 std::string 类型的值(它不是std::string文本),而是字符数组。
不幸的是,我同意你的观点,这是一个陷阱,在重载分辨率规则中,将数组转换为布尔型的转换优先于将其转换为const引用字符串。
请注意,C ++ 11中实际存在std::string 字面量,我就不在这里详细说明了。
修复过载的方法是显式地转换为std::string: write(std::string("data")) 将解决问题。
避免这个问题,这确实是一个陷阱。

另一个解决方案是,如果原始字符串字面值要传递到函数中,则添加const char*重载。 - emlai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接