进行比较时,为什么我必须施放无符号以避免警告

时间:2016-10-23 22:44:41

标签: boost-spirit boost-spirit-qi

在下面的示例中,如果我没有将4转换为unsigned,我会在default.hpp(144)中收到关于'< ='有符号/无符号不匹配的警告,然后再发出更多警告,我不遵循。

#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;
}

在这种情况下,总是最好总是施展吗?

使用Boost 1.61.0构建Visual Studio 2015

1 个答案:

答案 0 :(得分:0)

您正在将uint1_p解析器的属性与4进行比较。 uint1_p{}的属性类型为unsigned,因此您要将unsigneddecltype(4)进行比较,即int

进行混合符号比较很危险,编译器就会发出警告。问题是无符号整数算术是“具有传染性的”,这意味着4将被提升为无符号,而不是相反。如果您有例如风险,则存在风险。 _1 >= 0因为它永远不会是假的。

令人印象深刻的“错误小说”是因为警告在语义行为评估的精神代码内部深处产生。如果你写了一些更简单的东西,例如:

,你会得到同样的信息

Live On Wandbox

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

该程序在10次迭代后不会停止。编译器(在本例中为GCC)警告:

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

Q值。 我应该总是过来吗?

是。和不。你应该从不使用你写的¹式演员¹。你可以考虑static_cast<unsigned>(4)。但我只想写4u

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

¹见例如