c – “size_t”作为类型参数,不再复制投射警告
我一直试图摆脱一些旧代码中的警告(必须使用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确实如此 谢谢 最小的例子: 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`不会生成警告. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |