2016-10-23 4 views
1

以下の例では、4を符号なしとしてキャストしないと、default.hpp(144)の '< =' signed/)私はそれに続く多くの警告が続いた。比較を行うときに、警告を避けるために符号なしをキャストする必要があります

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

この場合、常にキャストするのが一番ですか?

建物のブースト1.61.0

答えて

0

とVisual Studioの2015年あなたが4からuint1_pパーサの属性を比較しています。 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. 私はいつもCAST必要がありますか?

はい。そして、いいえ。 決してあなたが書いたCスタイルのキャストを使用する必要がありますか?あなたはstatic_cast<unsigned>(4)と考えることができます。しかし、私は単純に4uを書きたい:

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

は、例えば参照してください。¹

関連する問題