混合索引和指针算法时避免使用C4365而不进行强制转换

时间:2017-05-31 19:00:23

标签: c++ visual-studio compiler-warnings

我有一个代码库,其中模板在一个向量中查找值,然后使用计算的索引在某个位置获取值。

以下是为视觉工作室提供的一些资料来概括:

#pragma once
#pragma warning(disable: 4514)
#pragma warning(disable: 4710) 
#pragma warning(disable: 4189)
#include <vector>

int main(int, char *[])
{
    //contrived example, never mind the non C4365 issues in this code
    //I am aware that this makes not a lot of sense runtime wise
    //This question is about a compiler warning
    int target;
    std::vector<char> first;
    std::vector<long> second;

    auto it = std::find(first.begin(), first.end(), target);
    //Warning C4365 '...': conversion from '...' to '...', signed/unsigned mismatch
    std::size_t pos = it - first.begin(); //from int to std::size_t
    long result = second.at(pos);

    return 0;
}

我特别感兴趣警告C4365。 MSDN有一个条目,还有另一个stackoverflow与此问题相关的问题。

我了解此std::size_t pos = static_cast<size_t>(it - first.begin());会删除警告。

我的问题是,是否可以编写上述查找和获取值,以便不需要强制转换来避免警告。

编辑:我没有提到此警告是警告级别4并且默认情况下已关闭。

1 个答案:

答案 0 :(得分:1)

下面的代码不会生成警告,因为您将int添加到迭代器中,该迭代器有效。

int main(int, char *[])
{
    //contrived example, never mind the non C4365 issues in this code
    //I am aware that this makes not a lot of sense runtime wise
    //This question is about a compiler warning
    int target;
    std::vector<char> first;
    std::vector<long> second;

    auto it = std::find(first.begin(), first.end(), target);
    auto it2 = second.begin() + ( it - first.begin() );
    long result = *it2;

    return 0;
}