2014-06-30 9 views
7
#include <iostream> 

using namespace std; 

struct A 
{ 
    explicit operator bool() const 
    { 
     return true; 
    } 

    operator int() 
    { 
     return 0; 
    } 
}; 

int main() 
{ 
    if (A()) 
    { 
     cout << "true" << endl; 
    } 
    else 
    { 
     cout << "false" << endl; 
    } 
} 

Meine Erwartung war, dass A() würde kontextuell zu bool meine operator bool() mit umgewandelt werden und daher true drucken.Warum wird mein "expliziter Operator bool()" nicht aufgerufen?

Die Ausgabe ist jedoch false, was zeigt, dass stattdessen operator int() aufgerufen wurde.

Warum wird mein explicit operator bool nicht wie erwartet aufgerufen?

+0

Ich erwarte, dass die Ausgabe wahr ist. Die tatsächliche Ausgabe ist jedoch "falsch" anstatt "wahr"! – xmllmx

+0

Bitte klären Sie Ihre Frage. – juanchopanza

+2

@xmllmx Sie haben nichts ausgearbeitet. –

Antwort

15

Da A() nicht const ist, ist die operator int() ausgewählt. Fügen Sie einfach const zum anderen Konvertierungsoperator und es funktioniert:

#include <iostream> 

using namespace std; 

struct A 
{ 
    explicit operator bool() const 
    { 
     std::cout << "bool: "; 
     return true; 
    } 

    operator int() const 
    { 
     std::cout << "int: "; 
     return 0; 
    } 
}; 

int main() 
{ 
    if (A()) 
    { 
     cout << "true" << endl; 
    } 
    else 
    { 
     cout << "false" << endl; 
    } 
} 

Live Example die Drucke: „Bool: true“ und ohne die const druckt „int: false“

Alternativ machen eine benannte Konstante:

// operator int() without const 

int main() 
{ 
    auto const a = A(); 

    if (a) 
    // as before 
} 

Live Example das druckt "bool: true".

+2

@ downvoter: bitte ausarbeiten damit ich meinen answswer verbessern kann! – TemplateRex

+1

Es gibt eine dritte Alternative (obwohl ich es nicht empfehle), die eine nicht-konstante Überladung von 'operator bool()' bereitstellen soll. –