C++中的默认参数不匹配

default argument mismatch in C++?

本文关键字:参数 不匹配 默认 C++      更新时间:2023-10-16

请考虑以下代码:

#include <iostream>
class Bar
{
public:
    void foo(bool b = false, std::string name = "");
};
void Bar::foo(bool b, std::string name)
{
    if (!b)
    {
       std::cout << "b is false" << std::endl;
    }
    else
    {
       std::cout << "b is true" << std::endl;
    }
}
int main()
{
    Bar myBar;
    myBar.foo("bla");
    return 0;
}

我想C++没有损坏,但任何人都可以解释为什么输出是真的吗?我正在研究VS 2010,但我也检查了运行gcc的ideone

编译器

将第一个参数 a char const[4] 隐式强制转换为 bool ,并产生true

相当于

myBar.foo((bool)"bla");

这也相当于

myBar.foo((bool)"bla", "");

因为"bla"是一个char const[4],它衰变为const char*,并被投射到布尔值。由于它的值不0,强制转换取值true。一个更简单的例子:

#include <iostream>
int main()
{
  std::cout << std::boolalpha; // print bools nicely
  bool b = "Hello";
  std::cout << b << "n";
}

生产

Bool 参数将 "bla" 转换为 true。您需要更改参数的顺序。