c++ - 字符串文字匹配 bool 重载而不是 std::string

标签 c++ string boolean overloading overload-resolution

我正在尝试编写一个具有一些重载方法的 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/

相关文章:

string - 删除给定字符串第一次出现之后/之前的所有内容

c# - 在 C# 中将 & 替换为 &

mysql - 如何从MySQL表中查询复杂的 boolean 条件

java - 为什么我的 boolean 值总是 true?

c++ - 使用AVL树的动态哈希表的复杂性

c++ - 遇到错误时循环不会中断

c++ - 哪个会更快

string - 带有变量的 NSLocalizedString 对我不起作用

c++ - 生成随机 boolean 值

C++ 递归模板特化