为什么Bool参数的函数接受String?

时间:2017-01-20 06:48:02

标签: c++ c++11

我有一个接受bool作为参数的函数:

void func(bool a)
{
    doing something;
}

但是当我调用该函数并将字符串传递给它时:

func("false");

实际上它应该只接受。

func(false);

它接受字符串而没有任何错误。

为什么?

4 个答案:

答案 0 :(得分:5)

Literal字符串是一个char指针,指针将隐式转换为bool。

  • 空指针 - > false
  • 非空指针 - > true

在这种情况下, func 将从非null " false" 字符串中接收true值,该值为{ {1}}输入。

您可能需要一个解释器功能才能从键盘输入中读取" false"," 0"," no"等等并转换为bool false该计划可以理解。

答案 1 :(得分:4)

根据C ++标准§4.14/ p1布尔转换[conv.bool] Emphasis Mine ):

  

算术,无范围枚举,指针或指针的prvalue   成员类型可以转换为bool类型的prvalue。零值,   null指针值,或null成员指针值转换为   假;任何其他值都转换为true。用于直接初始化   (8.6),类型为std :: nullptr_t的prvalue可以转换为prvalue   bool型;结果值为false。

也就是说,根据C ++标准,从字符串文字(即指针)到布尔值的转换是标准转换,因此您所遇到的是完全正常/标准的语言行为。

您可以通过将函数的泛型重载定义为已删除来限制函数显式接受bool值:

template<typename T> void func(T&&) = delete;

void func(bool a) {
  // do something...
}

Live Demo

答案 2 :(得分:2)

指针可以隐式转换为bool;如果指针为false,则值为NULL;如果指针为true,则值为!NULL。因此,由于您将指针传递给char * - 文字"false",因此该指针为! NULL并生成true。请参阅cpp reference concerning of implicit conversion中的以下定义:

  

布尔转换

     

整数,浮点,无范围的prvalue   可以将枚举,指针和指向成员的类型转换为   bool类型的prvalue。零值(对于积分,浮点,   和unscoped枚举)和空指针和null   指向成员的指针值变为false。所有其他值都成为现实

答案 3 :(得分:1)

@ 101010的答案很好。但是为了那些使用较旧的编译器(我怀疑不接受这种语法)的人的利益,还有另一种方法。

第一:
模板函数声明,没有定义/实现。这样,如果你用func("false")func('y')func(0)(一个int)意外地调用它,链接器就会抱怨。这将使你找到问题。

template<typename T> void func(T a);  // prototype only

将此与您的真实void func(bool a)函数一起声明。

如果你在一个类中有这个,你可以使模板函数/方法变为私有,这将使错误成为编译器错误(更容易理解,但如果意外错误键入的调用来自类或朋友,它仍然是链接器错误。)