2016-10-23 2 views
1

Wenn ich im Beispiel unten 4 nicht als vorzeichenlos werfe, erhalte ich eine Warnung über '< =' signed/unsigned mismatch in default.hpp (144) gefolgt von vielen weiteren Warnungen, denen ich nicht folge.Warum muss ich bei einem Vergleich eine nicht signierte Zahl werfen, um Warnungen zu vermeiden

#include <boost/spirit/include/qi.hpp> 
#include <boost/spirit/include/phoenix_operator.hpp> 
#include <string> 

namespace qi = boost::spirit::qi; 

typedef std::wstring::const_iterator it_type; 

int main() 
{ 
    using qi::_1; 
    using boost::spirit::_pass; 

    std::wstring testChar(L"450"); 
    auto f = testChar.begin(), l = testChar.end(); 

    unsigned pVal[2] = {0, 0}; 
    qi::uint_parser<unsigned, 10, 1, 1> uint1_p; 

    bool retVal = qi::parse(f, l, uint1_p[_pass = _1 <= (unsigned)4] >> qi::uint_, pVal[0], pVal[1]); 

    return 0; 
} 

Ist es am besten, in diesem Fall immer zu werfen?

Aufbauend auf Visual Studio 2015 mit Boost-1.61.0

Antwort

0

Sie das Attribut des uint1_p Parser 4 verglichen wird. Der Attributtyp uint1_p{} lautet unsigned. Sie vergleichen also unsigned mit decltype(4), also int.

Vergleichen von Vergleichen mit gemischten Zeichen ist gefährlich und der Compiler warnt davor. Das Problem ist, dass vorzeichenlose Integer-Arithmetik "ansteckend" ist, was bedeutet, dass 4 zu unsigned befördert wird, nicht umgekehrt. Dies ist ein Risiko, wenn Sie z. _1 >= 0 weil es nie falsch sein könnte.

Der beeindruckende "Fehlerroman" ist, weil die Warnung tief innerhalb des Geistcodes für semantische Aktionsauswertung auftaucht. Sie würden die gleiche Botschaft, wenn Sie etwas viel einfacher, wie z schreiben .:

Live On Wandbox

#include <iostream> 
int main() { 
    for (unsigned i = 10; i >= 0; --i) 
     std::cout << i << " "; 
} 

Dieses Programm nicht nach 10 Iterationen stoppt. Und der Compiler (in diesem Fall, GCC) warnt:

prog.cc:3:29: warning: comparison of unsigned expression >= 0 is always true [-Wtype-limits] 
    for (unsigned i = 10; i >= 0; --i) 
          ~~^~~~ 

Q. SOLL ICH IMMER CAST?

Ja. Und nein. Sie sollten nie verwenden Sie die C-Stil-Besetzung Sie wrote¹. Sie könnten static_cast<unsigned>(4) betrachten. Aber ich würde einfach schreiben 4u:

bool retVal = qi::parse(f, l, uint1_p[_pass = (_1 <= 4u)] >> qi::uint_, pVal[0], pVal[1]); 

¹ Siehe z.B.

Verwandte Themen