2011-02-25 156 views
11

隐式类型转换我有一个功能:void foo(bool boolParam = true)C++在Visual Studio 2010

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

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

+1

呃,它可能应该给你一些警告,但我想这是因为'NULL'在'windows.h'中简单地定义为'0'。好问题,但。 – 2011-02-25 08:29:05

+1

如果将警告级别设置为4(在项目设置中),您应该会收到一些警告。 – 2011-02-25 08:31:25

+0

@Volker:你确定/ W4会对此产生警告吗? – 2011-02-25 08:35:23

回答

6

行为是完全正确的,因为(如你注意的)从false(一个有效的空指针常量)指针是隐含的。改为尝试使用std::string

+2

我不认为从bool到指针的转换是隐含的。当我从false更改为true时,我有下面的错误:错误C2664:'foo':无法将参数1从'bool'转换为'const char *'。之前是正确的,因为false为0为NULL。 – Felics 2011-02-25 08:50:03

+0

@Felics:对,重新编写。 – MSalters 2011-02-25 09:02:13

7

你可以留下你的原有功能未实现:

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

现在只要您拨打foo()foo(true)foo(false)它会导致编译错误。但是,foo(NULL)将不会编译,因为NULL和false是不明确的(然后我们又回到了原点之一......)。

+0

为什么'foo(true)'或'foo(false)'会导致编译器错误? – templatetypedef 2011-02-25 09:42:13

+0

@templatetypedef我用VS测试过这个。我想这是因为'foo(true)'和'foo(false)'比第二个函数更好地满足第一个函数,并且因为第一个函数未实现,所以会导致编译器错误。这是我的教育猜测。 – Marlon 2011-02-25 09:49:48

+0

@ Marlon-啊,我错过了第一个功能未实现。这很聪明!在评论之前,我应该更仔细地阅读。 XD – templatetypedef 2011-02-25 09:52:26