2017-05-22 3 views
3

ce morceau de code me conduit nuts:première prise attrape tout type

#include<iostream> 
#include<string> 

int main() 
{ 
    std::string test = "foo"; 
    try 
    { 
     throw test; 
    } 
    catch (const int &x) 
    { 
     std::cout << "int " << x << "\n"; 
    } 
    catch (const double &x) 
    { 
     std::cout << "double " << x << "\n"; 
    } 
    catch (const std::string &x) 
    { 
     std::cout << "string " << x << "\n"; 
    } 
    return 0; 
} 

Rien fou ici. Mais la sortie ...

int 7675456 

je l'ai essayé sur mon linux VM, sur GDB en ligne et rempl-et il fonctionne très bien. Je veux dire que j'ai ce que j'attends:

string foo 

Je ne poste jamais ici parce que je trouve toujours une solution. Mais cette fois, il semble que je ne peux pas trouver une façon correcte de demander à Google et je suis juste perdu. Quelqu'un a une idée?

de Windows 10 et j'utilise MinGW

+2

Sur quel système obtenez-vous la sortie inattendue? – aschepler

+0

Aucun repro avec l'un des trois compilateurs habituels. –

+0

Impossible de reproduire, pouvez-vous donner des détails sur votre compilateur et votre plate-forme? –

Répondre

0

Il est difficile sans un facile cas repro, mais essayez ceci: Déplacez le

catch (const std :: string & x)

AVANT la capture pour int.

Ce que je soupçonne peut-être se produire est que, comme il peut en quelque sorte la chaîne peut être convertie en int, il essaie de le faire. Bien que cela ne soit pas une réponse complète, au moins vous êtes un peu plus près de comprendre ce qui se passe, et maintenant vous avez une solution de contournement.

Il est difficile de déboguer quelque chose comme ça à distance, mais si rien d'autre, c'est un bon exercice dans la logique critique et les approches de débogage.

+0

Si je fais ça, ça fonctionne bien. Le problème est que si je mets ce bloc là, il va attraper tous les types aussi: D – usePtr

+0

Ok, j'ai essayé la solution du compilateur changeant. Je viens de renommer mon dossier MinGW et j'ai utilisé le compilateur C de Perl (je viens de découvrir qu'il en avait un). Ça fonctionne bien. Donc je suppose que je pourrais juste télécharger une nouvelle copie de MinGW 64 et tout ira bien. – usePtr

+0

https://bugzilla.redhat.com/show_bug.cgi?id=1269290 peut être liée à la cause initiale. – Jakub