草庐IT

const_cast-ing

全部标签

c++ - 同名类之间的共享 vtables : call to virtual method crashes when casting to base type

检查下面的更新,我可以重现并需要帮助。我有一个奇怪的崩溃,其中一些方法在除1个地方之外的任何地方都可以正常工作。这是代码:structbase{virtualwchar_t*get()=0;//canbe{returnNULL;}doesn'tmatter};structderived:publicbase{virtualwchar_t*get(){returnSomeData();}};structcontainer{deriveddata;};//thisisapprox.howitisusedinrealprogramvoidoutput(constbase&data){data

c++ - 使用 dynamic_cast 向下转型返回 null

我尝试使用dynamic_cast将基类对象转换为派生类对象,但dynamic_cast返回null。是否可以使用dynamic_cast向下转型?structA{virtual~A(){}};structB:A{};intmain(){A*a=newA();B*b=dynamic_cast(a);if(b){std::cout此代码打印出“无值”。 最佳答案 因为a实际上是指向A,而不是B,所以dynamic_cast会失败。Isitpossibletodowncastusingdynamic_cast?是的,你可以,例如如果a恰

c++ - Const 变量随 C 中的指针改变

变量i被声明为const但我仍然可以使用指向它的内存位置的指针来更改值。怎么可能?intmain(){constinti=11;int*ip=&i;*ip=100;printf("%d\n",*ip);printf("%d\n",i);}当我编译时,我收到这个警告:test.c:Infunction‘main’:test.c:11:warning:initializationdiscardsqualifiersfrompointertargettype输出是这样的100100 最佳答案 const是一个编译时特性。它不会阻止你搬起石

c++ - C++ 中内置类型的 const 修饰符的开销

我更喜欢将const修饰符添加到我编写的函数中的所有内置参数。例如:voidfoo(constintarg1,constdoublearg2);对我来说比:voidfoo(intarg1,doublearg2);代码审查后,我得知const修饰符在应用于整数和内置类型时会带来开销。这是真的吗?为什么?谢谢, 最佳答案 它的开销并不比typedef多。你的同事错了。如果您想说服他,请打印出两个变体的反汇编代码,并向您的同事展示它们是相同的。但是,像这样向原始类型添​​加const限定符是完全没有意义和徒劳的。不管怎样,它们都是被复制的

c++ - STL 算法和 const_iterators

今天我写了一个小谓词来查找容器中的匹配符号。但是我遇到了一个问题:我想在类的常量方法内的std::find_if调用中使用这个谓词,在属于这个类。但我刚刚注意到std::find和std::find_if都不能对const_iterators进行操作!我检查了一些C++引用资料,似乎没有std::find或std::find_if版本接受/返回const_iterators。我只是不明白为什么,因为据我所见,这些算法无法修改迭代器引用的对象。这是在SGI实现中记录std::find的方式:Returnsthefirstiteratoriintherange[first,last)suc

c++ - C++ 中的 const 对象

我有一个关于常量对象的问题。在以下程序中:classconst_check{inta;public:const_check(inti);voidprint()const;voidprint2();};const_check::const_check(inti):a(i){}voidconst_check::print()const{inta=19;coutvoidprint()是类const_check的常量成员函数,所以根据常量的定义任何试图改变inta应该会导致错误,但该程序对我来说工作正常。我想我在这里有些困惑,有人能告诉我为什么编译器没有将其标记为错误吗?

c++ - 为什么以下不调用重载的 operator== (const String &, const String &)? "cobble"== "stone"

为什么以下不调用重载的operator==(constString&,constString&)?"cobble"=="stone" 最佳答案 因为在C++中,字符串字面量是constchar[]类型(也叫以零结尾的字符串常量),而不是std::string,更不用说String(无论是什么)。有一个内置的operator==通过比较它们的地址来比较两个char*。由于数组可隐式转换为指向其第一个元素的指针(由于,您猜对了,C继承),此运算符介入,您比较的是这些文字在内存中的地址。假设您的String类具有来自constchar*(

c++ - 如何从 LPWSTR 转换为 'const char*'

在使用C++/CLI将结构从C#转换为C++之后:publicvaluestructSampleObject{LPWSTRa;};我想打印它的实例:printf(sampleObject->a);但是我得到了这个错误:Error1errorC2664:'printf':cannotconvertparameter1from'LPWSTR'to'constchar*'如何将LPWSTR转换为char*?提前致谢。 最佳答案 使用wcstombs()函数,位于.下面是如何使用它:LPWSTRwideStr=L"Somemessage";

c++ - 如何在实现文件中初始化一个 static const set<string>?

我对staticconstset的初始化似乎不正确,我很感激你的指导方针:obj.h:classobj{...private:staticconstsetkeywords;...}obj.cpp:conststringkw[]={"GTR","LTR","LEQ","GEQ","NEQ","SQRT","sqrt"};constsetobj::keywords=(kw,kw+sizeof(kw)/sizeof(kw[0]));但这会产生错误:error:conversionfrom‘conststring*{akaconststd::basic_string*}’tonon-scala

c++ - 如何将对象添加到 vector<const Obj&>?

我不确定为什么这不能编译:std::vectormyVector;voidfoo(constObj&obj){myVector.push_back(obj);}抱歉,关于我要实现的目标的一些额外信息:我不能在不破坏接口(interface)的情况下更改foo的签名,但我只想卡在通过foo传递的对象上。我确实想存储指向它们的指针,但我对如何做到这一点的语法感到困惑。 最佳答案 您不能拥有引用vector。因为vector中的东西必须是可复制和可分配的,而引用不是这些。您可能需要一个指针vector:std::vectormyVecto