7
votes

C ++ 11 numéros lors de la déplacement de Visual Studio 2010 à 2012

J'essaie de porter mon projet de Visual Studio 2010 à Visual Studio 2012. Dans mon code, j'ai une manipulation de fichiers qui ressemble à ceci: xxx

ceci construit sans problème 2010, mais en 2012, il échoue sur le conditionnel avec:

Erreur C2678: Binary '!' : Aucun opérateur trouvé qui prend un opérande de gauche de type> 'std :: unique_ptr <_ty, _dx>' (ou il n'y a pas de conversion acceptable)
...
pourrait être "opérateur C ++ intégré! (bool) '

La norme C ++ 11 spécifie que unique_ptr a un opérateur BOOL Pour vous permettre de faire des contrôles rapides comme j'ai ci-dessus. Encore une fois, la définition unique_ptr de VS2012 a cet opérateur très: xxx

mais je reçois cette erreur lors de la compilation. Pourquoi?

Oui, je pourrais simplement utiliser destream au lieu de cela, mais c'est en plus du point.


1 commentaires

Cela semble être causé par l'utilisation d'une Lambda en tant que Delier personnalisé. Si vous utilisez quelque chose d'autre, par exemple Un objet de fonction régulier, alors il n'y a pas de problème.


3 Réponses :


1
votes

Vous pouvez utiliser si (! (fminute && widididally)) code> au lieu de if (! fminute ||! FindIndividual) code>. C ++ disent qu'ils sont convertibles à Bool, mais Opérateur BOOL CODE> Créez généralement des problèmes, par exemple, vous pouvez avoir une fonction qui accepte int code>, si votre classe a un opérateur bool code> alors il est convertible vers INT et vous pouvez le transmettre à cette fonction, mais par exemple dans notre cas unique_ptr code> jamais destiné à être utilisé comme un int code>, Tant de développeurs n'utilisent jamais bool bool code> directement mais écrivent un opérateur qui peut être utilisé comme un bool dans des expressions conditionnelles, mais il n'est pas réellement bool!

void test_int( int );
bool_convertible c;
test_int( c );


3 commentaires

Spécialisations de std :: unique_ptr sont pas convertible vers bool . Ils sont cependant contextuellement convertible à bool via l'utilisation d'un opérateur de conversion explicite sur bool .


@Lucdanton: Techniquement vrai, mais cela ne change rien, puisque "!" est l'un des contextes où les choses peuvent être contextuelles contextuellement à bool .


@Nicolbolas qui ne rend pas cette réponse plus utile.



6
votes

Pour construire sur ce que BigBoss a dit, C ++ 11 exige que std :: unique_ptr Utilisez Opérateur explicite BOOL () Noexcept , qui résout toute la conversion implicite à BOOL problème. Sauf ... VC2012 ne prend en charge exploitants explicite . Par conséquent, ils doivent utiliser le Safe-Bool Idiom .

tandis que le coffre-bool idiome est bon, il peut avoir des défauts (c'est pourquoi opérateur explicite bool () existe), en fonction de la manière dont vous implémentez l'idiome. Et vous avez apparemment couru l'un d'entre eux dans VC2012. Reconfigurant votre test, avec ! (Fminute && wididividuel) , devrait le résoudre.

Mais de toute façon, c'est un bogue Visual Studio. Étant donné que le comportement a changé, vous devez déposer un rapport de bogue même si vous parvenez à trouver un moyen de trouver un moyen de trouver un moyen de trouver.


1 commentaires

Vs2012 ne supporte pas non plus non plus



1
votes

dans la récente standard C ++ 11, STD :: unique_ptr n'a pas de opérateur! code> défini, seul l'opérateur de conversion explicite

if (!fMinute.get() || !fIndividual.get()) {
    ....


0 commentaires