加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – “size_t”作为类型参数,不再复制投射警告

发布时间:2020-12-16 06:59:24 所属栏目:百科 来源:网络整理
导读:我一直试图摆脱一些旧代码中的警告(必须使用MSVC 2005,目前正在使用32位版本),但一直在努力摆脱size_t到unsigned int转换警告.我们有自己的数组 T实现一个不断增长的数组的实现 模板 typename I const T at(const I i)const {return atImpl(i);} 方法.当被称
我一直试图摆脱一些旧代码中的警告(必须使用MSVC 2005,目前正在使用32位版本),但一直在努力摆脱size_t到unsigned int转换警告.我们有自己的数组< T>实现一个不断增长的数组的实现

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

方法.当被称为

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

我从’size_t’转换为’const unsigned int’,可能会丢失数据警告.一个工作原理是我被理解为unsigned int,这导致编译器在将i传递给at时将size_t转换/转换为unsigned int(这本身很不方便但可以接受).但是,我既没有在最小的工作示例(本文的底部)中再现这个警告,也没有在更复杂的最小例子中重现这个警告.简单地将参数转换为unsigned int会使警告消失,并且足以满足我们的需求(通过契约,数字适合unsigned int)

>我对这种调用中的unsigned int的理解是正确的(规范说“因此,typedef-name是另一种类型的同义词.typedef-name确实如此
不引入新类型“,typeid(size_t(1)).name()表示unsigned int和size_t似乎是typedeffed..换句话说,最小的例子应该或不应该给出警告吗?构建配置是相同的,据我所知.
>由于我们的代码给了我们警告,而最小的例子没有,我必须忽略一些东西.尽管付出了很多努力,但我无法弄清楚是什么.想法?

谢谢

最小的例子:

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<为size_t>(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 = 10更改为myint i = 10.

使用typedef __w64 unsigned int myint生成警告,其中’typedef unsigned int myint`不会生成警告.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读