草庐IT

const_cast-ing

全部标签

c++ - 处理不相关类型的 Dynamic Cast

#includeusingnamespacestd;classX{public:virtualvoidf(){}};classY{public:virtualvoidg(){}};intmain(){X*x=newX();Y*y=dynamic_cast(x);//A//Y*y=static_cast(x);//BcoutA编译而B不编译。我明白为什么B没有被编译但是为什么A被编译虽然X和Y是完全不相关的类型? 最佳答案 这就是为什么dynamic_cast在不相关的类型之间被允许:classX{public:virtualvoid

c++ - 为什么我们需要将 const 放在函数头的末尾,但首先是 static?

我有这样的代码...classTime{public:Time(int,int,int);voidset_hours(int);voidset_minutes(int);voidset_seconds(int);intget_hours()const;intget_minutes()const;intget_seconds()const;staticvoidfun();voidprintu()const;voidprints();private:intx;inthours;intminutes;intseconds;constinti;};为什么我需要在最后放置const来创建一个函数

c++ - const 是否允许在此处进行(理论上的)优化?

考虑这个片段:voidfoo(constint&);intbar();inttest1(){intx=bar();inty=x;foo(x);returnx-y;}inttest2(){constintx=bar();constinty=x;foo(x);returnx-y;}在我对标准的理解中,x和y都不允许被test2中的foo改变>,而它们可以通过test1中的foo进行更改(例如使用const_cast从constint&因为引用的对象在test1中实际上不是const。现在,neithergccnorclangnorMSVC似乎将test2优化为foo(bar());retu

c++ - 为什么 T const&& 不是转发引用?

在模板上下文中,应用以下“引用折叠”规则:templatevoidfoo(T&&t){//T&&->T&//T&&&->T&//T&&&->T&//T&&&&->T&&}为什么该语言禁止“通用引用”具有const限定符?templatevoidfoo(Tconst&&t)如果类型已解析为引用(4种情况中的3种),这似乎是有意义的。我确信这个想法与该语言的其他一些设计方面不兼容,但我不能完全看到全貌。 最佳答案 最初右值引用提案说如果P就会发生转换。是“右值引用类型”。However,adefectreport后来注意到了Additi

c++ - 支持 std::ostream operator << 中的 const_string

我目前正在使用非常聪明的包boost::const_string直到http://libcxx.llvm.org/可以在Ubuntu或GCC上预先打包,使其成为__versa_string(在headerext/vstring.h中)它的默认字符串实现。libcxx的std::string以及__versa_string默认使用_small-string优化(SSO)。默认支持输出到std::ostream然而缺乏。代码#include#includeconst_stringx;std::cout除非我们强制x否则不起作用通过c_str()进入C字符串这变成了std::cout它按预期

c++ - reinterpret_cast 什么时候修改位?

来自C++标准:5.2.10.3Themappingperformedbyreinterpret_castmight,ormightnot,producearepresentationdifferentfromtheoriginalvalue.我在这个网站接受过培训,相信并重复这一点。(即使可能只是琐事)。从float*到int*的reinterpret_cast被允许产生不同的位模式。唯一的保证是reinterpret_cast将结果返回到float*将产生原始位模式。我的问题:这会发生吗?是否存在实际reinterpret_cast为不同位模式的现有真实平台或CPU或编译器?如果不

c++ - 为什么 gcc 允许 const 对象没有用户声明的默认构造函数但不允许 clang?

最近Whydoesaconstobjectrequiresauser-provideddefaultconstructor?被标记为WhydoesC++requireauser-provideddefaultconstructortodefault-constructaconstobject?的拷贝.我正在使用coliru和rextexter测试不同版本的gcc(g++-4.7、g++-4.8、g++-4.9)和clang(3.4和3.5),看看新版本的编译器是否引入了这种行为。这里我们有两个测试用例,分别来自两个问题:classA{public:voidf(){}};intmain(

c++ - 共享库中模板化类和 dynamic_cast 的显式实例化

今天我遇到了一个我似乎无法解决的问题。我正在编译一个共享库,其中包含一个模板化类(Derived,其基础是Base)和此类的一些显式实例化。我希望图书馆用户从这个模板化类中扩展。当我尝试dynamic_cast时出现问题来自Base*的用户实例至Derived*.我已经将问题缩小到这个MWE:共享库包含以下文件:Base.h#ifndefBASE_H_#defineBASE_H_classBase{public:Base();virtual~Base();};#endif/*BASE_H_*/Derived.h#ifndefDERIVED_H_#defineDERIVED_H_#inc

c++ - 使用 extern const 将结构传递给模板。什么是外部?

我在问自己为什么下面的代码有效,以及说明符extern在实例化baz_instance时做了什么:structbaz{intvalue;};externconstbazbaz_instance={3};templateintfoo(){returnb.value;}intmain(){foo();return1;}为什么上面的代码首先编译,如果省略extern说明符,为什么它不再编译?extern说明符在此示例中的作用是什么? 最佳答案 这是从C++03到C++11的标准部分之一。在C++03中,[temp.arg.nontype]

c++ - cast 运算符函数在 g++ 中编译良好,但在其他编译器中则不然。为什么?

这个问题在这里已经有了答案:Operatorcast,GCCandclang:whichcompilerisright?(1个回答)关闭6年前。考虑以下程序:structS{usingT=float;operatorT(){return9.9f;}};intmain(){Sm;S::Tt=m;t=m.operatorT();//Isthiscorrect?}程序在g++中编译良好(参见现场演示here)但它在clang++、MSVC++和IntelC++编译器中编译失败clang++给出以下错误(参见现场演示here)main.cpp:8:20:error:unknowntypenam