gpt4 book ai didi

c++ - 我应该使用什么类型的迭代器差异来消除 "possible loss of data"警告?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:48:59 25 4
gpt4 key购买 nike

我需要一个通用的 x64 模式警告规则。哪种方式更好?

考虑以下几行代码

const int N = std::max_element(cont.begin(), cont.end()) - cont.begin();

const int ARR_SIZE = 1024;
char arr[ARR_SIZE];
//...
const int N = std::max_element(arr, arr + ARR_SIZE) - arr;

这是我常用的代码。我对 x86 没有任何问题。

但是如果我在 x64 模式下运行编译器,我会收到一些警告:

conversion from 'std::_Array_iterator<_Ty,_Size>::difference_type' to 'int', possible loss of data
conversion from '__int64' to 'int', possible loss of data

我想通过通用规则解决这些问题。哪种方式更好?

  1. 制作 static_cast :

    const int N = static_cast<int>(
    std::max_element(cont.begin(), cont.end()) - cont.begin() );

    我认为这不是通用的。还有太多的字母。

  2. 将输出类型替换为 ptrdiff_t :

    const ptrdiff_t N = std::max_element(cont.begin(), cont.end()) - cont.begin();

    那么我应该如何处理这个未知类型的 ptrdiff_t?然后我会再收到十几个警告。我想用 N 做很多操作:保存、加法、乘法、循环等。重要:但是如果std::_Array_iterator<_Ty,_Size>::difference_type怎么办?和 ptrdiff_t是不同的类型吗?

  3. 将输出类型替换为 std::_Array_iterator<_Ty,_Size>::difference_type :

    //h-file
    struct S {
    type mymember; // What is the type?
    };


    //cpp-file
    typedef std::vector<int> cont_t;
    const cont_t::difference_type N = std::max_element(cont.begin(), cont.end()) - cont.begin();
    // Save N
    S mystruct;
    mystruct.mymember = N; // What type of mystruct.mymember?

    我该如何保存N?什么类型的 mystruct.mymember?我在 h 文件中不知道。

  4. 您的解决方案。

最佳答案

“如果 std::_Array_iterator<_Ty,_Size>::difference_typeptrdiff_t 是不同的类型怎么办?”不要使用这样的编译器。此外,很可能它不能在形式上有所不同。例如。 vector 就是这种情况使用默认的标准分配器,因为这是它获取其 typedef 的地方,但由于正式保证无关紧要(嘿嘿,它真的无关紧要)我不会在 C++0x 草案中查找它。

所以,使用 ptrdiff_t .

但是添加一些 typedef 可能是个好主意,比如

typedef ptrdiff_t Size;
typedef ptrdiff_t Index;

然后在您的具体情况下,您将使用 Index .

这些 typedef 自然伴随着自定义独立 countOf , startOfendOf函数,使您能够以完全相同的方式处理原始数组和标准库容器。

当您看到名称 Index更清楚的是它是一个索引,它不能很自然地脱离Index。或 Size几乎无论您做什么,都有一组类型。例如,向其中添加一些内容,它仍然是 Index .所以大多数情况下不会有“另外一打警告”。

但在极少数情况下,您需要从 Index 获取只是int , 说。在极少数情况下,只需执行 static_cast关闭编译器并明确您的意图。甚至是自定义 static_cast -喜欢narrowTo操作,为了表达...

干杯,

关于c++ - 我应该使用什么类型的迭代器差异来消除 "possible loss of data"警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3941660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com