3

考虑以下代码:

#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

4

3 回答 3

4

编译器隐式转换第一个参数 a char const[4], to bool,并导致true.

相当于

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

这也相当于

myBar.foo((bool)"bla", "");
于 2012-08-16T07:26:59.867 回答
1

因为"bla"是 a char const[4],它衰减为const char*,并被强制转换为布尔值。由于它的 value is not 0,所以演员表采用 value true。一个更简单的例子:

#include <iostream>

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

}

生产

真的

于 2012-08-16T07:28:16.390 回答
0

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

于 2012-08-16T07:27:16.467 回答