我有一个接受bool作为参数的函数:
void func(bool a)
{
doing something;
}
但是当我调用该函数并将字符串传递给它时:
func("false");
实际上它应该只接受。
func(false);
它接受字符串而没有任何错误。
为什么?
答案 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...
}
答案 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)
函数一起声明。
如果你在一个类中有这个,你可以使模板函数/方法变为私有,这将使错误成为编译器错误(更容易理解,但如果意外错误键入的调用来自类或朋友,它仍然是链接器错误。)