我正在尝试编写一个具有一些重载方法的 C++ 类:
class Output
{
public:
static void Print(bool value)
{
std::cout << value ? "True" : "False";
}
static void Print(std::string value)
{
std::cout << value;
}
};
现在假设我按如下方式调用该方法:
Output::Print("Hello World");
这是结果
True
那么,为什么,当我定义了该方法可以接受 boolean 值和字符串时,当我传入一个非 boolean 值时,它是否使用 boolean 重载?
编辑:我来自 C#/Java 环境,对 C++ 很陌生!
最佳答案
"Hello World"
是“12 个数组const char
”类型的字符串文字,可以转换为“指向const char
的指针”,而后者又可以转换为bool
.这正是正在发生的事情。编译器更喜欢使用 std::string
的转换构造函数。
涉及转换构造函数的转换序列称为用户定义的转换序列。来自 "Hello World"
的转换到 bool
是一个标准的转换序列。标准规定标准转换序列始终优于用户定义的转换序列(第 13.3.3.2/2 节):
a standard conversion sequence (13.3.3.1.1) is a better conversion sequence than a user-defined conversion sequence or an ellipsis conversion sequence
这种“更好的转换序列”分析是针对每个可行函数的每个参数进行的(并且您只有一个参数),并且通过重载决议选择更好的函数。
如果您想确定 std::string
版本被调用,你需要给它一个 std::string
:
Output::Print(std::string("Hello World"));
关于c++ - 字符串文字匹配 bool 重载而不是 std::string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14770252/