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

时间:2012-08-16 07:24:51

标签: c++ type-conversion default-parameters

请考虑以下代码:

#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

3 个答案:

答案 0 :(得分:4)

编译器隐式地将第一个参数char const[4]转换为bool,并生成true

相当于

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

也等同于

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

答案 1 :(得分:1)

因为"bla"char const[4],它会衰减到const char*,并被强制转换为bool。由于它的值不是0,因此广播会使用值true。一个更简单的例子:

#include <iostream>

int main()
{
  std::cout << std::boolalpha; // print bools nicely
  bool b = "Hello";
  std::cout << b << "\n";

}

产生

  

答案 2 :(得分:0)

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