2014-06-30 16 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; 
    } 
} 

La mia aspettativa era che A() sarebbe stato contestualmente convertito in bool usando il mio operator bool(), e quindi stampare true.Perché il mio "operatore esplicito bool()" non è chiamato?

Tuttavia, l'output è false, che indica che è stato invocato invece operator int().

Perché il mio explicit operator bool non viene chiamato come previsto?

+0

Mi aspetto che l'output sia vero. Tuttavia, l'output reale è 'false' piuttosto che' true'! – xmllmx

+0

Per favore chiarisci la tua domanda. – juanchopanza

+2

@xmllmx Non hai elaborato nulla. –

risposta

15

Perché A() non è const, è selezionato operator int(). Basta aggiungere const all'altro operatore di conversione e funziona:

#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 che stampa: "bool: true" e senza la const esso stampe "Int: true"

In alternativa, fare una chiamata costante:

// operator int() without const 

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

    if (a) 
    // as before 
} 

Live Example che stampa "bool: true".

+2

@downvoter: si prega di elaborare in modo da poter migliorare la mia risposta! – TemplateRex

+1

C'è una terza alternativa (sebbene io non la raccomandi), che è quella di fornire un overload non-const di 'operator bool()'. –

Problemi correlati