我一直听到这种说法,但我真的找不到const_cast邪恶的原因。在以下示例中:templatevoidOscillatorToFieldTransformer::setOscillator(constSysOscillatorBase&src){oscillatorSrc=const_cast*>(&src);}我正在使用引用,并且通过使用const,我可以保护我的引用不被更改。另一方面,如果我不使用const_cast,代码将无法编译。为什么const_cast在这里不好?同样适用于以下示例:templatevoidSysSystemBase::addOscillator(cons
这个问题涉及我在尝试回答thisearlier,intriguingquestionaboutC-stylecastsandtypeconversions时在C++规范中注意到的内容。.C++规范在§5.4中讨论了C风格的强制转换。它表示强制转换符号将按此顺序尝试以下强制转换,直到找到一个有效的强制转换:const_caststatic_caststatic_cast紧随其后的是const_castreinterpret_castreinterpret_cast紧随其后的是const_cast.虽然我对使用static_cast的含义有一个非常直观的想法。后跟const_cast(例如
我对static_cast的感受很复杂,因为它是可用的最安全的C++强制转换,但同时允许安全和不安全转换,所以你必须知道上下文来说明它是否真的安全或可能导致UB(例如,当强制转换为子类时)。那么为什么没有更安全的显式转换呢?这是一个示例,它可能有用。在COM中,它们必须将接口(interface)指针返回为void**ppv,所以“必须”明确地转换*ppv=(IInterface*)this;后来建议用更安全的C++强制转换*ppv=static_cast(this);但是,即使是static_cast也有意义吗?这里?this是派生自IInterface的类,所以可以简单地写IInt
当我想在不同的整数类型之间进行转换时,似乎最好的语法是使用boost::numeric_cast():inty=99999;shortx=boost::numeric_cast(y);//willthrowanexceptionifyistoolarge我从来没有用过;但是语法非常简单,所以一切都很好。现在假设我想做一些更高级的事情:我希望它返回目标类型的最小值或最大值(饱和度),而不是抛出异常。我想不出一种表达方式,但是documentation表明这是可能的(可能使用RawConverter策略)。我能想到的只是以下丑陋的:shortx=numeric_cast(max(min(y
什么是implicit_cast?我什么时候应该更喜欢implicit_cast而不是static_cast? 最佳答案 我正在复制我对answerthiscomment的评论在另一个地方。Youcandown-castwithstatic_cast.Notsowithimplicit_cast.static_castbasicallyallowsyoutodoanyimplicitconversion,andinadditionthereverseofanyimplicitconversion(uptosomelimits.you
我在看一段C++代码,main函数的第一行引起了我的注意:intmain(intargc,constchar*argv[]){(void)argc;(void)argv;...}除此行之外,根本不使用argc和argv。为什么作者要进行空投?是否可以阻止编译器提示未使用的变量? 最佳答案 “是否可以阻止编译器提示未使用的变量?”是的 关于c++-argc和argv的voidcast,我们在StackOverflow上找到一个类似的问题: https://sta
我想使用lexical_cast将float转换为字符串。通常它工作正常,但我对没有小数的数字有一些问题。如何修复字符串中显示的小数位数?例子:doublen=5;stringnumber;number=boost::lexical_cast(n);结果编号是5,我需要编号5.00。 最佳答案 来自boostlexical_cast的文档:Formoreinvolvedconversions,suchaswhereprecisionorformattingneedtightercontrolthanisofferedbythedef
我有一些这样的代码structB{B(){}B(intv){}};structA{operatorint()const{return1;}operatorB()const{returnB();}};intmain(){Aa;static_cast(a);//Errorherea.operatorB();//ThisisOKreturn0;}会产生这样的编译错误:main.cpp:Infunction‘intmain()’:main.cpp:16:21:error:callofoverloaded‘B(A&)’isambiguousstatic_cast(a);^main.cpp:4:5
这个问题的灵感来自评论here.考虑以下代码片段:structX{};//novirtualmembersstructY:X{};//mayormaynothavevirtualmembers,doesn'tmatterY*func(X*x){returndynamic_cast(x);}一些人建议他们的编译器会拒绝func的正文.但是,在我看来,这是否由标准定义取决于x的运行时值。.来自第5.2.7节([expr.dynamic.cast]):Theresultoftheexpressiondynamic_cast(v)istheresultofconvertingtheexpres
在thisanswer,出现了以下场景:#includestructA{};structB{virtual~B(){}};structAA{};templatestructC:A,T{};intmain(){B*b=newC;AA*aa=newC;assert(dynamic_cast(b));assert(dynamic_cast(aa));//thislinedoesn'tcompile,asexpected}在g++4.8.4(Ubuntu)上,它编译并且断言通过。我的问题是,这真的合法吗?我觉得您根本不应该将dynamic_cast转换为非多态类,但我坦率地承认,我不是这里发生