问题 Visual Studio 2010中的C ++隐式类型转换


我有一个功能: void foo(bool boolParam = true)

我改为: void foo(const char* charParam, bool boolParam = true)

为了避免搜索,我只编译了代码,希望编译器会因为参数类型错误而调用函数时出错(或至少是警告),但编译器默认将false转换为false NULL 并编译所有内容,没有错误或警告。这种行为是否正确?我知道那是假的 NULL 都是0,但我认为编译器应该至少给出一些警告信息......


2458
2018-02-25 08:26


起源

呃,它可能会给你一些警告,但我想这是因为 NULL 只是#defined in windows.h 如 0。但问题很好。 - Cody Gray♦
如果将警告级别设置为4(在项目设置中),您应该收到一些警告。 - Volker Voecking
@Volker:您确定/ W4会对此发出警告吗? - Cody Gray♦
在Mac OS上的GCC 4.2中也有相同的行为 - Felics
@Cody Gray,我刚用/ W4进行了测试,它没有发出任何警告 - Marlon


答案:


这种行为完全正确,因为(正如您所注意到的)转换来自 false (一个有效的空指针常量)到指针是隐式的。试试吧 std::string 代替。


6
2018-02-25 08:33



我不认为从bool到指针的转换是隐含的。当我从false变为true时,我遇到了以下错误:错误C2664:'foo':无法将参数1从'bool'转换为'const char *'。之前是正确的,因为false为0为NULL。 - Felics
@Felics:对,重写。 - MSalters


您可以保留原始功能未实现:

void foo(bool boolParam = true);
void foo(const char* charParam, bool boolParam = true)
{
  // do stuff
}

现在每当你打电话 foo()foo(true),和 foo(false) 它会导致编译错误。然而, foo(NULL) 不会编译因为NULL和false是不明确的(然后我们回到原点...)。


7
2018-02-25 09:06



为什么会 foo(true) 要么 foo(false) 导致编译错误? - templatetypedef
@templatetypedef我用VS测试了这个。我想这是因为 foo(true) 和 foo(false) 比第二个函数更好地满足第一个函数,并且因为第一个函数未实现,它会导致编译器错误。那是我受过教育的猜测。 - Marlon
@ Marlon-啊,我错过了第一个功能未实现。那很聪明!在评论之前我应该​​仔细阅读。 XD - templatetypedef