gpt4 book ai didi

c++ - "size_t"作为类型参数,未重现转换警告

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:19:23 24 4
gpt4 key购买 nike

我一直在尝试消除一些旧代码中的警告(必须使用 MSVC 2005,目前使用 32 位构建),但一直在努力消除 size_tunsigned int转换警告。我们有自己的Array<T>实现一个不断增长的数组的实现

template<typename I> const T& at(const I i) const {return atImpl(i);}

方法。当调用为

size_t i = 10; myArray.at(i);

我得到一个 conversion from 'size_t' to 'const unsigned int', possible loss of data警告。一个工作理论I理解为 unsigned int ,这导致编译器强制转换/转换 size_tunsigned int通过时 iat (这会带来不便但可以接受)。但是,我无法在最小工作示例中重现此警告(本文底部),也无法在更复杂的最小示例中重现此警告。只需将参数转换为 unsigned int使警告消失并且足以满足我们的需求(根据契约(Contract),该数字适合 unsigned int )

  1. 我对I的理解是?正在unsigned int在这样的调用中是正确的(规范说“A typedef-name 因此是另一种类型的同义词。typedef-name 确实not introduce a new type", typeid(size_t(1)).name()unsigned intsize_t 似乎是 typedef fed)。换句话说,最小的例子应该或不应该发出警告?构建配置是一样,据我所知。
  2. 由于我们的代码给了我们警告,而最小的示例没有,所以我必须忽略一些事情。尽管付出了所有努力,但我无法弄清楚是什么。想法?

谢谢

最小的例子:

    template<typename T>
class A
{
int t;
public:
template<typename I> T& at(const I i) { return t;}
};

int main()
{
size_t i = 10;
A<int> a;
a.at(i) = 5; // no warning, why?
return 0;
}

最佳答案

at 函数也是模板化的。 C++ 将尝试推断模板类型参数。这就是您的代码中发生的事情,因为您没有在调用中指定类型,例如 a.at (1);

此代码将生成警告,因为它已将类型推断为 unsigned int,然后我们尝试传递一个 size_t

template <typename T>
class A
{
int t;
public:
template<typename I> T& at(const I i)
{ return t;}
};

int main()
{
unsigned int j = 5;
size_t i = 10;
A<int> a;

a.at(j) = 4; // deduce template type as unsigned int
a.at(i) = 5; // generate warning
return 0;
}

编辑:我实际上在 VS 中尝试了这段代码,它生成了警告。

Edit2: 在我试过的代码中,size_t 和 unsigned int 也是 4 个字节。所以我做了一些挖掘。在旧版本的 VS 中,size_t 定义为 typedef __w64 unsigned int size_t '__w64' 现在已弃用,但用于标记在移动到 64 位平台时具有不同大小(例如 64 与 32)的类型。 __w64 导致编译器看到 size_t作为不同的类型。

作为实验,我输入了自己的 unsigned int myint并更改了行 size_t i = 10myint i = 10 .

使用 typedef __w64 unsigned int myint生成警告,而 typedef unsigned int myint 不生成警告。

关于c++ - "size_t"作为类型参数,未重现转换警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9786307/

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