【问题标题】:C4267: 'return' : conversion from 'size_t' to 'const UINT', possible loss of dataC4267:“return”:从“size_t”转换为“const UINT”,可能丢失数据
【发布时间】:2024-01-17 13:12:01
【问题描述】:

如何使用类型转换为 const UINT 来解决以下警告?

C4267: 'return' : 从 'size_t' 转换为 'const UINT',可能丢失数据

Class CManager
{
   std::vector<CString>    m_ncount;
   public:
    const UINT GetMCount( int nInst) const;
}


const UINT CManager::GetMCount( int nInst) const
{
     return m_ncount.size();//C4267
}

这是正确的吗?:

const UINT CManager::GetMCount( int nInst) const
{
     return (const UINT)m_ncount.size();//C4267
}

【问题讨论】:

  • 为什么不返回 size_t?
  • size_t 保证代表 C++ 中任何对象的大小,而 UINT 不能。改为返回size_t
  • 没有理由返回const UINT。只需返回 UINT(或者更好的是 std::size_t)。

标签: c++ casting


【解决方案1】:

UINT(这不是标准的。unsigned int 实际上是标准的)至少是 16 位,这意味着它的实现是可靠的。不保证它可以作为index 或容器size 工作。但是,根据定义,size_t 的大小与sizeof 运算符的输出完全相同。保证在所有平台上的所有情况下都能正常工作。

所以,解决方案是使用size_t。任何其他解决方案都将忽略实际问题。感谢您的编译器警告!

【讨论】:

    【解决方案2】:

    如果您可能需要在向量中保存多个 INT_MAX 项,请使用 size_t。在大多数情况下,这并不重要,但我使用size_t 只是为了删除警告。

    试试这个

    std::size_t CManager::GetMCount( int nInst) const
    {
         return m_ncount.size();
    }
    

    【讨论】:

    • 你想表达auto CManager::GetMCount( int nInst) const -&gt; decltype(m_ncount.size()) { return m_ncount.size();} 吗?而且不需要返回一个const值,是传值的
    【解决方案3】:

    如果您使用UINT,那么您可能是在windows 下编码。在 32 位应用程序中,sizeof(UINT)sizeof(size_t) 等于 4,但在 64 位构建下这是不正确的,sizeof(UINT) 是 4 而sizeof(size_t) 是 8。

    一种解决方案是使用UINT_PTR,也可以使用添加静态断言的任何类型,例如:

    static_assert(sizeof(UINT_PTR) == sizeof(size_t), "size_t must equal to ULONG_PTR");
    

    如果您没有绑定到 windows 平台及其特定类型宏定义,则考虑返回size_t

    【讨论】: