2013-08-20 13 views
3

我有兩個重載函數爲什麼條件運算符在作爲參數傳入時會被視爲bool?

void foo(std::string value); 
void foo(bool value); 

當我

foo(true ? "a" : "b"); 

爲什麼函數接受一個布爾值將被調用,而不是字符串打電話了嗎?

+3

是否需要字符串作爲'std :: string'或'const char *'? – m0nhawk

+0

以下是兩個示例:['const char *'](http://ideone.com/FKyejs)和['std :: string'](http://ideone.com/AUIRya)。 – m0nhawk

+0

@ m0nhawk它需要std :: string。 – ycshao

回答

10

由於在const char*bool之間進行了轉換,因此bool過載提供了更好的匹配。字符串重載需要轉換爲用戶定義的類型。

條件運算符與它無關。例如,

#include <string> 
#include <iostream> 

void foo(bool) { std::cout << "bool" << std::endl; } 

void foo(std::string) { std::cout << "string" << std::endl; } 

int main() 
{ 
    foo("a"); 
} 

輸出:

布爾

如果你提供過載

void foo(const char*) {} 

那麼一會被調用。

+0

所以'void foo(const char *)'會返回? – Zigma

+0

@Zigma它將被選擇通過其他兩個重載。它有最好的匹配,因爲''東西''衰減到'const char *'。 – juanchopanza

+0

@juanchopanza所以如果我想調用一個帶字符串的字符串,我應該做foo(std :: string(「a」))嗎? – ycshao

相關問題