2017-05-17 5 views
2

Ich habe den folgenden Code:Implizite Besetzung von const String bool

#include <iostream> 
#include <string> 

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

void foo(long long int a) 
{ 
     std::cout << "long long int" << std::endl; 
} 

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

int main(int argc, char* args[]) 
{ 
     foo("1"); 
     return 0; 
} 

Bei der Ausführung ich diese Ausgabe erhalten:

bool 

Ich würde als Ausgang zu erwarten:

string 

Warum impliziert g ++ 4.9 diese Zeichenfolge implizit auf bool?

Antwort

3

Ihr Compiler interpretiert den Standard korrekt. Ja, das ist ein schwieriger Fall, den viele Interviewer fragen, damit sie schlauer aussehen, als sie wirklich sind.

Die Route const char[2] (die formale Art des Literals "1") bis zu const char*bool ist eine Standardkonvertierungssequenz, da sie Arten ausschließlich in integrierten Anwendungen.

Ihr Compiler Muss Gunst, die auf eine benutzerdefinierte Konvertierungssequenz, nämlich. der std::string Erbauer von einem const char*.

Das Vorhandensein der Überlastung void foo(long long int a) ist ein Red Hering.

können Sie eher elegant Arbeit um diese in C++ 11 durch Ihre Überlastung bool fallen, und

#include <type_traits> 
template < 
    typename Y, 
    typename T = std::enable_if_t<std::is_same<Y, bool>{}> 
> 
void foo(Y) 
{ 
    std::cout << "bool" << std::endl; 
} 

an seiner Stelle zu schreiben. Der Compiler wird dann die std::string für const char[N] über die Vorlage bevorzugen (da dies eine der Anforderungen der Überladungsauflösung ist). Nett!

0

"1" ist ein String-Literal, das ist Array von char, die in Zeiger und dann in bool konvertiert wird. Beachten Sie, dass dieser Pfad der impliziten Konstruktion eines temporären Objekts std::string vorgezogen wird.

0

"1" ist ein String-Literal, das - wenn es als Funktionsargument verwendet wird - zu einem Zeiger vom Typ const char* zerfällt. Da für die Funktion foo unter const char* keine Überlastung vorliegt, jedoch eine Standardkonvertierung von const char* zu bool erfolgt, fällt diese auf foo(bool) zurück. Beachten Sie, dass ein Zeigerwert, wenn er als Bool-Argument verwendet wird, wie somePtr==nullptr ? false : true interpretiert wird.

Verwandte Themen