Hvorfor gjør en sitert streng kamp bool metode signatur før en std :: string?

stemmer
14

Gitt følgende metoder:

// Method 1
void add(const std::string& header, bool replace);

//Method 2
void add(const std::string& name, const std::string& value);

Det kan virke som følgende kode vil ende opp med å kalle metode 1 i stedet for metode 2:

something.add(Hello, World);

Jeg endte opp med å skape en annen metode som ser slik ut:

//Method 3
void MyClass::add(const char* name, const char* value) {
    add(std::string(name), std::string(value));
}

Det funket. Så det synes at når en metode godtar en sitert streng det vil matche i følgende rekkefølge:

  1. const char*
  2. bool
  3. std::string

Hvorfor skulle en sitert streng bli behandlet som en boolfør std::string? Er dette vanlig oppførsel? Jeg har skrevet en anstendig mengde med kode for dette prosjektet, og har ikke hatt noen andre problemer med feil metode signatur blir valgt ...

Publisert på 19/07/2009 klokken 02:36
kilden bruker
På andre språk...                            


3 svar

stemmer
14

Min gjetning er konvertering fra pekeren til bool er en implisitt primitive typen konvertering, hvor konverteringen til std::stringkrever samtalen av en konstruktør og bygging av en midlertidig.

Svarte 19/07/2009 kl. 02:38
kilden bruker

stemmer
6

Pekere har en implisitt konvertering til bool. Kanskje du har sett følgende:

void myFunc(int* a)
{
    if (a)
        ++(*a);
}

Nå, i C ++, implisitte konverteringer mellom innebygde typer forrang over konverteringer mellom klasse-typer. Så for eksempel hvis du hadde en klasse:

class Int
{
public:
    Int(int i) {}
}

Og du overbelastet en funksjon for longog Int:

void test(long n) {cout << "long";}
void test(Int n) {cout << "Int";}

Du vil se at følgende kode kaller lang overbelastning:

int i;
test(i);
Svarte 19/07/2009 kl. 03:54
kilden bruker

stemmer
9

I ditt tilfelle har du har overbelastet funksjoner. Overbelastning vedtak skjer etter § 13.3.

C ++ 03 13.3.3.2/2:

Når man sammenligner de grunnleggende former for implisitte konverterings sekvenser (som definert i 13.3.3.1)
- en standard konvertering sekvens (13.3.3.1.1) er en bedre omdannelse sekvens enn en brukerdefinert omdannelse sekvens eller en ellipse omdannelse sekvens, og
- en brukerdefinert konvertering sekvens (13.3.3.1.2) er en bedre omdannelse sekvens enn en ellipse omdannelse sekvens (13.3.3.1.3).

Konvertering pekeren inn bool er en standard konvertering. Omdannelse pekeren til std :: streng er en brukerdefinert konvertering.

4.12 Boolske konverter en r-verdi av aritmetisk, opplisting, pekeren , eller peker til organ-typen kan omdannes til en r-verdi av type bool . En nullverdi, null pekerverdien, eller null medlem pekerverdi blir omdannet til false; en hvilken som helst annen verdi omdannes til sann.

Svarte 19/07/2009 kl. 05:53
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more