草庐IT

const_cast-ing

全部标签

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++ - 条件运算符 + upcast + const 引用

灵感来自thisquestion,我尝试了以下代码:structA{virtualvoiddoit()const=0;};structB:publicA{virtualvoiddoit()const;};structC:publicA{virtualvoiddoit()const;};voidfoo(boolp){constA&a=(p?static_cast(B()):static_cast(C()));a.doit();}EverycompilerIhavetried使用-Wall-Werror接受此代码并生成我想要的程序集。但是在仔细阅读了C++03规范第12.2节(“临时对象”

c++ - operator[](const char *) 歧义

下面的代码#includestructFoo{operatordouble(){return1;}intoperator[](std::stringx){return1;}};intmain(){Foo()["abcd"];}使用g++编译良好,但使用clang和intel编译器编译失败,因为声明的方法和native运算符[]之间存在歧义。如果Foo隐式转换为int,我会很清楚,但这里转换为double。这不是解决了歧义吗? 最佳答案 §13.3.3.1.2[over.ics.user]/p1-2:Auser-definedconv

C++ [错误] 'operator==' 不匹配(操作数类型为 'Vehicle' 和 'const Vehicle')

我正在为我的学校做一个项目(我还是个初学者),我遇到了以下问题:"[Error]nomatchfor'operator=='(operandtypesare'Vehicle'and'constVehicle')"Vehicle是我项目中的一个类。这就是给我错误的原因:intDayLog::findWaitingPosistion(Vehicleconst&v){if(find(waitingList.begin(),waitingList.end(),v)!=waitingList.end())return1;}waitingList是Vehicle对象的vector。我搜索并找不到答

c++ - 为什么 `const` 会作用于它之前的那个东西?

我正在学习C++。在我的类(class)中,解释说最好将const立即放置在您想要使其不可更改的内容之后,因为这就是const的方式有效。很多人,包括BjarneStroustrup本人,都喜欢在前面写const。但这有时会导致问题:constint*foo;//modifiablepointertoaconstantint.intconst*bar;//constantpointertoamodifiableint?No!It'samodifiablepointertoaconstantint.(Sothesametypeasfoo)一个显示此操作的示例:intfun(intcons

c++ - 自动化 C++ 类的 pimpl'ing——有简单的方法吗?

Pimpl是许多C++代码中样板的来源。它们似乎是宏、模板和一些外部工具的组合可以帮助解决的问题,但我不确定最简单的方法是什么。I'veseentemplates这有助于完成一些提升,但作用不大——您最终仍然需要为您尝试包装的类的每个方法编写转发函数。有没有更简单的方法?我正在想象一个工具用作制作过程的一部分。你希望你的公共(public)头文件是pimpl'd类,所以你提供一些输入文件,比如pimpl.in,它列出了你想要包装的类(实现的非pimpl'd),然后检查该文件,生成pimpl类,并且在“makeinstall”期间仅安装它们的header(不是原始类的header)。问题

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++ - "Most important const"带条件表达式?

考虑以下代码:intfoo(MyClassconst*aPtr=0){MyClassconst&a=aPtr?*aPtr:MyClass();//Eitherbindto*aPtr,ortoadefault-constructedMyClass...returna.bar();}"mostimportantconst"希望在这里使用。目的是允许空aPtr传入(顺便说一句,是的,它必须是一个指针参数),在这种情况下是一个临时的MyClass对象将是默认构造的,并且其生命周期通过绑定(bind)到它的const引用来延长。然而,如果aPtr不为空,引用将绑定(bind)到其指向的对象,而不

c++ - 当 const 方法是公共(public)的并且非 const 方法受到保护时,为什么 C++ 不强制转换为 const?

我创建了一个类,其中包含两个get方法,一个是常量,一个是非常量。const方法是公共(public)的,因此用户可以查询vector。非常量方法是protected,所以我可以用它来修改我需要的数据。但是,当我尝试使用该类并调用get方法时,编译器提示非常量方法受到保护。相反,我必须使用const_cast将对象转换为const,这样我就可以获得公共(public)方法。有办法解决吗?既然有公共(public)方法,为什么编译器不自己进行转换呢?如果我删除protected版本并只保留const版本,它可以正常工作,所以在这种情况下它确实会执行转换。转换为const总是安全的。它正在

c++ - 为什么绑定(bind)到三元的 const 引用会生成拷贝?

这个问题在这里已经有了答案:Returntypeof'?:'(ternaryconditionaloperator)(4个答案)关闭7年前。我对此感到困惑:#includestructX{};voidf(constX&x){std::cerr为什么f的第二次调用会生成一个临时拷贝?编辑:这个问题与其说是类型X,不如说是复制的事实。我从已接受的答案中遗漏了值类别的微妙之处,并期望f的参数直接绑定(bind)到x或X()上,就像将其改写为if语句时那样。