取下面的代码#includevoidfunc(){inti=2147483640;while(i这段代码显然是错误的,因为只有当签名的inti溢出(即UB)时,while循环才能终止,因此编译器可能会例如将其优化为无限循环(Clang在-O3)上执行,或执行其他类型的时髦的事情。我现在的问题是:根据我对C++标准的阅读,与签名may别名等效的类型(即指针int*和unsigned*可以别名)。为了做一些时髦的签名“包装”,以下是否有未定义的行为?#includestaticintsafe_inc(inta){++reinterpret_cast(a);returna;}voidfu
是static_cast(...)在编译时或运行时完成的事情?我用谷歌搜索,但我得到了不同的答案。另外,dynamic_cast(...)显然是运行时——但是reinterpret_cast(...)呢?? 最佳答案 取决于您要转换的内容。例如。static_cast("Hello")最终调用std::string构造函数。在我的脑海中,我想不出任何reinterpret_cast的情况需要生成实际的机器指令。它只是告诉编译器:采用这种位模式,并相信它是这种类型的值。 关于c++-sta
所以我正在阅读dynamic_castfrom"void*"的答案尽管您不能从void*转换为T*一些响应指出可以转换T*到void*,但不要给出任何指示为什么你想这样做。这只是可能的琐事,还是有可能有意义的情况?我考虑过可能是为了可读性或明确我们正在转换为void*,但考虑到dynamic_cast的目的,它不太适合我。就此而言,除了让T*隐式变为void*之外,还有什么理由去做吗?我已经看到不时使用C风格强制转换为void*code>指向一个指针或其他东西)。 最佳答案 首先,使用dynamic_cast(x)时你会得到一个指向
我有这段代码,GCC会打印“什么!?”。我怎样才能避免这种情况,所以voidActor只是有C意思“忽略孤独的'a;'”?#includestructA{templateoperatorT(){std::cout 最佳答案 如您所见,这是bugingcc.标准如下:c++1112.3.2Conversionfunctions[class.conv.fct](1)Aconversionfunctionisneverusedtoconverta(possiblycv-qualified)objectto[...](possiblycv-q
numeric_limits特征应该是获取各种类型信息的通用方法,以便能够做类似的事情templateTmin(conststd::vector&vect){Tval=std::numeric_limits::min();for(inti=0;i问题在于(至少使用MSVisualStudio2008)numeric_limits::min()返回最小的负数,而numeric_limits::min()返回最小的正数数字!有人知道这个设计背后的原理吗?有没有更好的(推荐的?)使用numeric_limits的方法?在我上面的特定函数中,我当然可以将T初始化为vect[0],但这不是我要寻
这里有一些看起来可以工作的代码:#include#includeenumtest{A=1};intmain(){intmax=std::numeric_limits::max();assert(max>0);}但它在Linux上的GCC(4.6.2)和clang(2.9)下都失败了:枚举类型的max()实际上为零!即使您使用C++11枚举类型说明符明确说明您希望枚举具有什么类型,这仍然是正确的。这是为什么?至于C++11的行为,是否有明确要求?我在关于强类型枚举的论文N2347中没有提到它。 最佳答案 std::numeric_li
在调试我们的一些代码(C++)时,我发现了这个:inlinestd::stringBufferToStr(constunsignedchar*buffer,intindex,size_tlength){std::stringretValue(reinterpret_cast(&buffer[index],length));returnretValue;}这段代码的问题(忽略了缺少指针和字符串长度检查)是reinterpret_cast的右括号被放在length之后,而它应该有在&buffer[index]之后。起初我认为这是编译器的问题(使用VS2013),但在使用VS2012和gcc
在INT64_MAX上使用数字限制宏(例如std::numeric_limits)是否有任何论据??据我了解numeric_limits在标准中,但宏仅在C99中,因此非标准。 最佳答案 其他答案大多有正确的信息,但似乎需要为C++11更新。在C++11中,std::numeric_limits::min(),std::numeric_limits::max(),和std::numeric_limits::lowest()都声明了constexpr,因此它们可以在大多数与INT_MIN相同的上下文中使用和公司。我能想到的唯一异常(e
所以我有一个两个字符数组unsignedcharv[2];我想将v[0]的值显示为0到255之间的数字,但是cout所以我尝试了cout或printf("%d\n",v[0]);这正是我想要的,但我一点也不喜欢。另外我完全不明白为什么这不起作用:cout(v[0]) 最佳答案 (通俗地说)reinterpret_cast用于以实现定义的方式将对象的位解释为另一种类型。您不希望这样:您想要转换(从char到int)。请改用static_cast。(reinterpret_cast的所有可能用途都列在5.2.10中;这不是其中之一。)
reinterpret_castingachar*(或char[N])在哪些情况下是未定义行为,何时定义行为?我应该使用什么经验法则来回答这个问题?我们从thisquestion了解到,以下是未定义的行为:alignas(int)chardata[sizeof(int)];int*myInt=new(data)int;//OK*myInt=34;//OKinti=*reinterpret_cast(data);//但是在什么时候我们可以对char数组执行reinterpret_cast并且让它不是未定义的行为?下面是几个简单的例子:没有new,只有reinterpret_cast:al