2011-02-25 206 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