在下面的示例中,如果我没有将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
答案 0 :(得分:0)
您正在将uint1_p
解析器的属性与4
进行比较。 uint1_p{}
的属性类型为unsigned
,因此您要将unsigned
与decltype(4)
进行比较,即int
。
进行混合符号比较很危险,编译器就会发出警告。问题是无符号整数算术是“具有传染性的”,这意味着4
将被提升为无符号,而不是相反。如果您有例如风险,则存在风险。 _1 >= 0
因为它永远不会是假的。
令人印象深刻的“错误小说”是因为警告在语义行为评估的精神代码内部深处产生。如果你写了一些更简单的东西,例如:
,你会得到同样的信息#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]);
¹见例如