2013-03-26 1 views
7

Pourquoi le code suivant affiche-t-il "A boolean!"? Je me rends compte qu'une conversion bizarre est en cours, car si je construis explicitement une chaîne std :: string, j'obtiens le bon comportement. Mais pourquoi la résolution de surcharge choisit-elle visitor::operator()(bool) dans le cas suivant?boost :: variante visiteur choisit la mauvaise surcharge

#include <boost/variant.hpp> 
#include <string> 

typedef boost::variant<bool, std::string> type; 

struct visitor : public boost::static_visitor<> { 
    void operator()(bool b) const { 
     std::cout << "A boolean!" << std::endl; 
    } 

    void operator()(const std::string& str) const { 
     std::cout << "A string!" << std::endl; 
    } 
}; 

int main(int argc, char* argv[]) { 
    type t = "I am a string"; 
    t.apply_visitor(visitor()); 

    return 0; 
} 

J'exécute Visual Studio 2012 (CTP ou donne pas le même résultat)

+0

FTR le membre 'apply_visitor' ne fait pas partie de l'interface publique. Vous êtes censé utiliser la version autonome: 'apply_visitor (visitor(), t)'. –

+0

Merci @LucDanton. Manqué que quand je lis la documentation –

Répondre

7

Vous initialisng t avec un (type qui se désintègre) const char*. La conversion d'un pointeur en bool est une conversion standard, tandis que la conversion const char* en std::string est une conversion définie par l'utilisateur. La conversion standard a la priorité.

Questions connexes