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: ceci construit sans problème 2010, mais en 2012, il échoue sur le conditionnel avec: p> 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) 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: p> mais je reçois cette erreur lors de la compilation. Pourquoi? P> Oui, je pourrais simplement utiliser
...
pourrait être "opérateur C ++ intégré! (bool) ' p>
blockQuote> destream code> au lieu de cela, mais c'est en plus du point. P> P>
3 Réponses :
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 );
Spécialisations de std :: unique_ptr code> sont pas i> convertible vers
bool code>. Ils sont cependant contextuellement i> convertible à
bool code> via l'utilisation d'un opérateur de conversion code> explicite sur
bool code>.
@Lucdanton: Techniquement vrai, mais cela ne change rien, puisque "!" est l'un des contextes où les choses peuvent être contextuelles contextuellement à bool code>.
@Nicolbolas qui ne rend pas cette réponse plus utile.
Pour construire sur ce que BigBoss a dit, C ++ 11 exige que tandis que le coffre-bool idiome est bon, il peut avoir des défauts (c'est pourquoi 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. P> std :: unique_ptr code> Utilisez
Opérateur explicite BOOL () Noexcept code>, qui résout toute la conversion implicite à BOOL problème. Sauf ... VC2012 ne prend en charge em>
exploitants explicite code>. Par conséquent, ils doivent utiliser le Safe-Bool Idiom . P>
opérateur explicite bool () code> 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) code>, devrait le résoudre. P>
Vs2012 ne supporte pas non plus non plus
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()) {
....
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.