草庐IT

static_casting

全部标签

c++ - g++ 上 constexpr 上下文中成员指针的 static_cast

我在使用static_cast在constexpr上下文中向上转换成员指针时遇到了g++问题。请参见代码示例。在使用g++6.3和7.0版进行编译时,会出现编译错误,指出reinterpret_cast不是常量表达式。虽然clang4.0版没有给出错误,但我认为这是正确的,因为这里没有reinterpret_cast。这是g++或clang中的错误吗?什么是正确的行为?structBase{};structDerived:Base{inti;};structPtr{constexprPtr(intDerived::*p):p(static_cast(p)){}intBase::*p;}

c++ - 将 reinterpret_cast 的派生类指针转换为基类指针未定义行为吗?

看一个简单的例子:structBase{/*somevirtualfunctionshere*/};structA:Base{/*members,overriddenvirtualfunctions*/};structB:Base{/*members,overriddenvirtualfunctions*/};voidfn(){Aa;Base*base=&a;B*b=reinterpret_cast(base);Base*x=b;//usexhere,callvirtualfunctionsonit}这个小片段是否有未定义的行为?reinterpret_cast定义良好,它返回base

c++ - 将 reinterpret_cast 输入重新解释为 std::unique_ptr 永远不会真正安全吗?

当使用具有可变大小结构(必须分配为byte[]然后转换为结构)的各种API时,如果unique_ptr持有者可以指向该结构,那将是很好的,因为这就是我们将要做的正在使用。例子:std::unique_ptrv;v.reset(reinterpret_cast(newBYTE[bytesRequired]));这允许`v提供结构本身的View,这是更可取的,因为我们不需要第二个变量,除了删除之外我们不关心字节指针。问题在于可能会在强制转换上对指针进行thunk(使其释放不安全)。我看不出为什么编译器会在cast上更改指针值(因为没有继承),但我听说标准保留对任何cast上的任何指针进行t

C++ static_cast 和引用

structA{};structB:A{};intmain(){Aa;A&a_ref=a;static_cast(a);//*1static_cast(a_ref);//*2return0;}(*1)产生错误,我明白为什么。(*2)编译正常,但为什么呢?而且,只要它编译并假设B包含一些属性,如果我将a_ref转换为B&然后尝试访问属性会怎样?我想我会遇到运行时错误或其他问题。所以,正如我所看到的,有一种情况会导致崩溃,并且没有办法避免它,这与dynamic_cast不同,后者可以检查转换结果是否为null或输入代码在try-catch区域。我如何处理这种情况,我需要转换引用并确保我真的

c++ - 如何在 C++ 中将 static_assert 用于 constexpr 函数参数?

我的库中有几个简短的constexpr函数可以执行一些简单的计算。我在运行时和编译时上下文中都使用它们。我想在这些函数的主体中执行一些断言,但是assert(...)在constexpr函数和static_assert中无效(...)不能用于检查函数参数。例子:constexprintgetClamped(intmValue,intmMin,intmMax)noexcept{assert(mMinmMax?mMax:mValue);}有没有办法检查函数是否在运行时或编译时常量中执行,并且仅当它在运行时执行时才执行断言-时间?constexprintgetClamped(intmValu

c++ - static_assert - 一种动态自定义错误消息的方法

有没有办法让static_assert的字符串动态自定义然后显示?我的意思是://pseudocodestatic_assert(Check_Range::value,"Valueof"+typeof(T)+"typeisnotsogood;)"); 最佳答案 没有,没有。但这并不重要,因为static_assert是在编译时求值的,如果出现错误,编译器不仅会打印消息本身,还会打印实例堆栈(在模板的情况下)。看看这个综合示例inideone:#includetemplatestructIsInteger{staticboolcons

c++ - 重载 static_cast?

所以,前几天我参加了考试,其中一个问题与此非常相似:我们有一个类叫做Square其中包含一个变量intside.我们怎样才能使cout(aSquare)成为可能会打印出aSquare的面积吗?这可能吗? 最佳答案 有可能做到这一点,但不能通过重载static_cast().您可以通过重载类型转换运算符来实现:classSquare{public:Square(intside):side(side){}operatorint()const{returnside*side;}//overloadedtypecastoperatorpri

c++ - 为什么报错LINK2005 : object already defined error disappears when I declare the object as static

我在头文件中定义了以下结构和结构对象,如下所示:structSTConfigurationDetails{boolbAutoStart;boolbAutoLog;boolbAutoScan;boolbAutoMount;boolbAutoOpen;boolbAutoDetectLast;};structSTConfigurationDetailsg_objConfigurationDetails;在自己的头文件中,我同时拥有使用g_objConfigurationDetails的方法和方法体。当我将头文件包含到另一个cpp文件并调用该方法时,这工作正常。但是当我将头文件添加到另一个cp

casting - 在 Kotlin 中可以进行交叉转换吗?

我在Java中有这样的方法:publicmethodName(Targ,...)其中A是一个类,B是一个接口(interface)。在我的kotlin类中,我有另一个C类型的variable,我希望实现以下目标:if(variableisA&&variableisB){methodName(variable,...)}else{//dosomethingelse}是否可以正确地转换variable以便它可以用作参数而不会出错?Currently,thevariablehasasettermethod,sosmartcastingisn'tavailable.However,Ihavea

casting - 在 Kotlin 中可以进行交叉转换吗?

我在Java中有这样的方法:publicmethodName(Targ,...)其中A是一个类,B是一个接口(interface)。在我的kotlin类中,我有另一个C类型的variable,我希望实现以下目标:if(variableisA&&variableisB){methodName(variable,...)}else{//dosomethingelse}是否可以正确地转换variable以便它可以用作参数而不会出错?Currently,thevariablehasasettermethod,sosmartcastingisn'tavailable.However,Ihavea