C'est l'opération “false < true” bien définis?

Le C++ spécification de définir:

  1. l'existence de la "moins que" l'opérateur pour les paramètres booléens, et, dans l'affirmative,
  2. le résultat de l'4 paramètre de permutations?

En d'autres mots, ce sont les résultats de ces opérations définies par le cahier des charges?

false < false
false < true
true < false
true < true

Sur ma configuration (Centos 7, gcc 4.8.2) , le code ci-dessous crache ce que j'avais prévu (donnée C de l'histoire de l'représente false 0 et vrai 1):

false < false = false
false < true = true
true < false = false
true < true = false

Alors que je suis sûr que la plupart (tous?) les compilateurs donnera le même résultat, est-ce la loi, par le C++ cahier des charges? Ou est abrutissant, mais la spécification conforme compilateur autorisé à décider que le vrai est moins faux?

#include <iostream>

const char * s(bool a)
{
  return (a ? "true" : "false");
}

void test(bool a, bool b)
{
  std::cout << s(a) << " < " << s(b) << " = " << s(a < b) << std::endl;
}

int main(int argc, char* argv[])
{
  test(false, false);
  test(false, true);
  test(true, false);
  test(true, true);
  return 0;
}
  • g++-4.9.0 et clang++-3.5.0 sur Linux pense que c'est banal: coliru.stacked-crooked.com/a/2174ebc466d0c445
  • Il y a des utilisations valides. Comme l'utilisation de std::min sur std::vector<bool> comme &&.
  • si vous pouvez trouver une bonne question qui n'a pas encore été demandé après toutes ces années de StackOverflow, vous méritez un peu de points. Ce n'est pas à la traîne.
  • La motivation pour la poser est authentique: je suis assez novice en C++ (en provenance de la C) et que vous souhaitez stocker des objets dans un std::set<>. Ma mise en œuvre de mon objet < opérateur est principalement basée sur une propriété booléenne de l'objet, suivi par d'autres secondaires d'identifier les propriétés. Lors d'une itération sur l'ensemble, je veux être sûr que le "faux" objets viennent en premier. Alors qu'il travaille pour moi, ici et maintenant, je suis à la recherche de réconfort, il est garanti de fonctionner sur les plates-formes (y compris ceux intégrés), sans avoir à recourir inutilement à l'utilisation des (un ? 1 : 0), ou similaire, dans mon objet < opérateur.
  • Une fâcheuse conséquence est que p <= q signifie p implies q quand p et q sont de type bool!
  • Je ne suis pas clair sur ce que vous trouver inquiétant à ce sujet. Pourriez-vous en dire un peu plus?
  • Sans doute ce qui est troublant, c'est que <= peut-être par inadvertance, se lire comme un leftarrow, et que le "seulement si" (c'est à dire, "[matériellement] implique") rightarrow est parfois composées à la main ou de manière informelle, écrit de la même façon à => (c'est à dire, avec un doublé de l'arbre ressemblant à =). Un leftarrow est même parfois lire que "si," si je crois que c'est bien moins courante que l'utilisation d'un rightarrow pour "seulement si".
  • Exactement comme Elie dit. p <= q ressemble q implique p, mais, en fait, signifie p implique q.
  • Être très prudent avec ce que si vous interagissez avec les COM et/ou Sql Server, parfois ils définissent vrai que -1.
  • Apparemment, il est bien définie. C'est un peu triste. Comme une langue en s'efforçant trop dur d'être populaire. Il est peut-être une commodité pour "commander" le vrai et le faux, il est logiquement absurde. Donc, si vous commandez le vrai et le faux est un facteur de conception dans un modèle, l'OMI, l'auteur devrait être forcé de choisir la commande explicitement. Heck, la prochaine étape pourrait être faux ou vrai est moins vrai ou vrai - parce que deux vrais battements un vrai.
  • "est-ce que la loi, par le C++..." j'espère bien que les programmes ne pas commencer à écrire les lois...
  • de nombreux compilateurs ont des extensions qui ne font pas partie de la norme. Il y a aussi des zones où la norme déclare que le comportement est définie par l'implémentation(différent de comportement indéfini) qui signifie qu'elle peut varier d'un compilateur de compilateur et encore autorisé par la norme. Si cette distinction est importante, et ce type de question permet souvent une langue de l'avocat question.

InformationsquelleAutor duncan | 2014-10-01