警告 C4018: '<' : signed/unsigned 不匹配?

3

当我在VS下编译此代码时,会出现一个警告。

if (m_nDarksideEffectAttCnt < m_DarkTargetIndex.size())

if (m_DuelWatchUserList.size() <= iIndex)

警告:

& warning C4018: '<=' : signed/unsigned mismatch

    

任何解决方案?
2个回答

6
作为警告所说的,这是因为有符号类型(即m_nDarksideEffectAttCntiIndex)和无符号类型(即m_DuelWatchUserList.size())之间的比较。
中,我们正好有std::cmp_less来解决这个问题。
#include <utility> // std::cmp_less

if (std::cmp_less(m_nDarksideEffectAttCnt, vec.size()))
{
    // 
}

这也包括以下情况:如果我们错误地将 -1(即int)强制转换为unsigned int,那么以下操作将不会产生错误:
static_assert(1u < -1);

但是以下内容将会

static_assert(std::cmp_less(1u, -1)); // error

也请查看其他函数

std::cmp_equal
std::cmp_not_equal
std::cmp_greater
std::cmp_less_equal
std::cmp_greater_equal

2
不错!我不知道那些函数!+1 - Ted Lyngmo

2

m_nDarksideEffectAttCntiIndex带符号类型,而(标准库)size()函数返回一个无符号类型(std::size_t)。

您可以通过将m_nDarksideEffectAttCntiIndex的类型更改为std::size_t或在比较中进行强制转换来消除警告:

if(static_cast<std::size_t>(m_nDarksideEffectAttCnt) < m_DarkTargetIndex.size())
//...
if (m_DuelWatchUserList.size() <= static_cast<std::size_t>(iIndex))

或者如果iIndexm_nDarksideEffectAttCnt可以有负值:
if(m_nDarksideEffectAttCnt < static_cast<long long>(m_DarkTargetIndex.size())
//...
if (static_cast<long long>(m_DuelWatchUserList.size()) <= iIndex)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接