- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我一直在尝试消除一些旧代码中的警告(必须使用 MSVC 2005,目前使用 32 位构建),但一直在努力消除 size_t
至 unsigned 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_t
至 unsigned int
通过时 i
至 at
(这会带来不便但可以接受)。但是,我无法在最小工作示例中重现此警告(本文底部),也无法在更复杂的最小示例中重现此警告。只需将参数转换为 unsigned int
使警告消失并且足以满足我们的需求(根据契约(Contract),该数字适合 unsigned int
)
I
的理解是?正在unsigned int
在这样的调用中是正确的(规范说“A typedef-name 因此是另一种类型的同义词。typedef-name 确实not introduce a new type", typeid(size_t(1)).name()
说 unsigned int
和 size_t
似乎是 typedef
fed)。换句话说,最小的例子应该或不应该发出警告?构建配置是一样,据我所知。谢谢
最小的例子:
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
此代码将生成警告,因为它已将类型推断为 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 不生成警告。
关于c++ - "size_t"作为类型参数,未重现转换警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9786307/
error C2664: 'errno_t wcstombs_s(size_t *,char *,size_t,const wchar_t *,size_t)' : cannot convert pa
size_t有什么区别和 std::size_t在声明它们的位置,何时应该使用它们以及任何其他差异化功能方面? 最佳答案 C的size_t和 C++ 的 std::size_t都是一样的。 在 C 中
刚读完: Does "std::size_t" make sense in C++? 我意识到使用 ::size_t不符合标准(虽然我的编译器支持)当你#include .我想遵守标准,但我不想在前
有什么理由不假设 SIZE_T 是 Microsoft 的 Visual C/C++ 编译器上 size_t 的类型定义? Windows intsafe.h 函数确实包括从一个函数到另一个函数的安全
size_t 和 std::size_t 在声明的位置、应在何时使用以及任何其他区别特性方面有何区别? 最佳答案 C 的 size_t和 C++ 的 st
在某些 Windows API 调用中,我得到:cannot convert argument 6 from 'size_t *' to 'SIZE_T *' . This answer告诉我SIZE
将迭代器条件右操作数从 size_t 转换为 int 更好,还是迭代可能超过 int 的最大值?答案实现具体吗? int a; for (size_t i = 0; i (i)) (有关 numeri
我尝试了三个连续的行(每个单独一个),但是没有一个起作用。 为什么?? int main() { size_t j{8}; char arr[static_cast(j)]={'t'}
我的 C++ 知识一塌糊涂。我有 Apple 提供的代码,他们像往常一样提供了不完整的解决方案。 在此代码中,他们提供了两个空的方法 header : - (NSString *)encodeBase
这是证据: inline constexpr std::size_t prev(std::size_t i) { --i; return i; } int main() { s
我对 size_t 的某些行为感到困惑我注意到: size_t zero = 0x1 << 32; size_t big = 0x1 << 31; size_t not_as_big = 0x1 <<
size_t 在哪里什么时候我什么都没有? 总是假设 size_t 是否合理? == std::size_t ? 什么时候应该使用 size_type在 std容器(string::size_type
我在为 32 位编译时遇到此错误。相同的文件在 64 位 Windows 上编译没有错误 1>c:\project\test.cpp(1317) : error C2664: 'StringCbCop
我希望只有一个模板函数。所以我想到了…… template > || std::is_same_v > > > std::ostream& op
我正在使用 Visual Studio 2017 社区版。它允许我在没有适当包含的情况下同时使用 size_t 和 std::size_t。它似乎适用于大多数 std 库。我认为这是因为图书馆本身的一
我可能要疯了,但我认为我从未在 C++ 中看到过这种情况(尽管我的引用代码是在 C 中)。为什么这里代码的返回值上有一个static,有什么影响?我认为我从未见过类范围之外的静态函数(但显然 C 没有
它没有在 std::string 中明确列出 constructor doc ,(编辑: 这里的人说我应该引用实际的 cppreference 而不是 cplusplus.com)但显然它有效。这意味
将 -1 分配给 size_t 类型的变量 t 并检查它与 -1 和 4294967295(FFFFFFFF,2 对-1 的补充;我的系统是64 位;值可能因系统而异),那么在这两种情况下,它都返回
我正在实现循环数组数据结构,其代码如下所示: struct CircularArrayException : public std::exception { std::string msg;
这个问题在这里已经有了答案: how to pass 2 dimensional array if both dimensions are unknown at compile time (5 个答
我是一名优秀的程序员,十分优秀!