草庐IT

c++ - 编译器是否避免中间整数提升或转换?

考虑这样一个类:structmystruct{constexproperatorchar(){returnx;}signedcharx;};和这样的操作:mystructm;m.x=/*somethingatruntime*/inti=3*m+45ULL*m;编译器是否可以跳过临时转换为char并直接将m转换为3*m+45ULL*m中所需的类型>表达? 最佳答案 似乎GCC版本5.3.0能够优化对cast函数的调用,而Clang3.7就没那么聪明了。对于这段代码:structmystruct{constexproperatorcha

c++ - 通过继承层次结构进行 dynamic_casting 是不好的做法吗?

我有以下数据结构:classElement{std::stringgetType();std::stringgetId();virtualstd::vectorgetChildren();}classA:publicElement{voidaddA(constA*a);voidaddB(constB*b);voidaddC(constC*c);std::vectorgetChildren();}classB:publicElement{voidaddB(constB*b);voidaddC(constC*c);std::vectorgetChildren();}classC:publi

C++ 类型转换

这个问题在这里已经有了答案:关闭12年前。PossibleDuplicate:Whenshouldstatic_cast,dynamic_castandreinterpret_castbeused?直到几天前,我一直在C++中使用C风格的类型转换,因为它似乎工作得很好。我最近发现在C++中使用C非常糟糕..我以前从未真正使用过C++转换,所以我想知道是否有人可以告诉我(最好用他们自己的话)static_cast、reinterpret_cast和const_cast之间的区别是什么?const_cast我知道从某些东西中删除了一个“const”,但我不确定它们之间的区别是什么,以及我需

C++ - 如何正确地将 double 转换为 int

我目前正在编写一个需要对平方根取底的程序。因为我取平方根的值是正数,所以我只是将它转换为int。所以说下面的例子:inti=16;intj=std::sqrt(i)j应该是4。不过我想知道,sqrt是否有可能返回3.9999999991而不是4.000000001或其他什么,而j的结果是3?是否有定义浮点行为的规则?我怎样才能正确地将其转换为int? 最佳答案 几乎所有广泛使用的硬件都使用IETF754float,尽管C++不需要它。假设IETF754float和::std::sqrt到IETF754浮点平方根运算的直接映射,您可以

c++ - 带引用和不带引用的指针类型转换

鉴于A*pA;和B*pB;,以下类型转换之间是否存在任何差异(查询所有C++样式类型转换):pB=reinterpret_cast(pA);//pointerpB=reinterpret_cast(pA);//pointer-reference 最佳答案 两者截然不同,至少在理论上(并且可能在实际上,一些稀有机器)。第一个接受指向A的指针,然后将其转换为指向B的指针;至少在理论上,这可能涉及大小和表示的变化。(我实际上在机器上工作过其中char*大于int*.我相当怀疑任何这样的机器仍然存在,尽管可能在嵌入式世界中……)第二个实际上

c++ - 为什么某些隐式类型转换在一台机器上是安全的而不是在另一台机器上?我怎样才能防止这个跨平台问题?

我最近在我的代码中发现了一个错误,我花了几个小时来调试。问题出在定义为的函数中:unsignedintfoo(unsignedinti){longintv[]={i-1,i,i+1};...returnx;//evaluatedbythefunctionbutnotessentialhowforthisproblem.}v的定义在我的开发机器(ubuntu12.0432位,g++编译器)上没有造成任何问题,其中unsignedint被隐式转换为longint,因此负值得到了正确处理。在不同的机器上(ubuntu12.0464位,g++编译器)但是这个操作并不安全。当i=0时,v[0]没

c++ - 类型定义和转换

typedef似乎是特定于C++的(可能在某些其他语言中)。我发现它隐藏了值的真实数据类型,因此使项目新手感到困惑。也许有时缩短打字是有用的。你什么时候推荐使用typedef?我还注意到我无法将typedef值传递给接受基础类型的函数?类似于:typedefstringVAL;VALs="x";func(stringx);//ifItrytopass`s`,Igetsomethinglikenoinstanceoffunctiontemplatematchargumentlist 最佳答案 typedef是用于从现有类型创建新类型的

c++ - 这个 C++ 转换代码在做什么?

在这里找到:https://github.com/tpaviot/oce/blob/master/src/BRepAdaptor/BRepAdaptor_Curve.cxx我想知道的是:((GeomAdaptor_Curve*)(void*)&myCurve)->Load(C,First,Last);myCurve已定义为GeomAdaptor_Curve。所以它看起来像是将指向myCurve的指针转换为void*,然后将that转换为GeomAdaptor_Curve*,然后取消引用它并对其调用Load。这样做的可能原因是什么,而不是简单地调用myCurve.Load?

c++ - 在 C++ 中正确地将 `void*` 转换为整数

我正在处理一些使用外部库的代码,您可以在其中通过void*值将值传递给回调。不幸的是,之前编写此代码的人决定通过将整数转换为空指针((void*)val)来将整数传递给这些回调。我现在正在努力清理这个烂摊子,我正在尝试确定将整数转换为void*的“正确”方法。不幸的是,修复void指针的使用有点超出了我在这里能够做的返工的范围。现在,我正在执行两次转换以从/转换为void指针:static_cast(reinterpret_cast(void_p))和reinterpret_cast(static_cast(dat_val))由于我在64位机器上,直接转换((int)void_p)会导

c++ - 检查引用上的静态转换

很久以前,我创建了一个以下模板,以便在我执行static_cast时得到一个断言,但类型不是我假设的类型:///performastatic_castassertedbyadynamic_casttemplateTypestatic_cast_checked(SourceTypeitem){Assert(!item||dynamic_cast(item));returnstatic_cast(item);}今天我想创建一个不仅适用于指针而且适用于引用的变体:///overloadforreferencetemplateType&static_cast_checked(SourceTyp