草庐IT

c++ - 防止派生类强制转换为基类

我有classRect{//stuff};和classSpecialRect:publicRect{private:operatorconstRect(){return*this;}//NoimplicitscaststoRectpublic://stuff};SpecialRect继承了Rect的所有属性和方法,除了我想避免从SpecialRect到基类Rect的非显式转换。在代码中SpecialRectoneSpecial;RectaRect=oneSpecial;//Iwantthistonotcompile.(toremind-metodeclareaRectasSpecial

转换为较小类型时 C++ 截断

我有一个64位longint,其中包含一些位域。我需要将存储在第二个和第三个字节中的16位带符号整数添加到一个32位值中。我正在使用这样的东西:u32Function(s32value,u64bitfield){returnvalue+(s16)(bitfield>>8)}在将位域扩展为32位有符号整数并执行加法之前,我能否依赖编译器将位域转换为16位有符号整数?如果不是,我还应该如何截断剩余字节并执行我需要的类型转换? 最佳答案 是的,需要注意的是您依赖于特定于编译器和体系结构的行为。当然,依赖这种行为会使您陷入真正难以诊断的“特

c++ - C++ 语言标准对 static_cast 如何处理减小整数的大小有何规定?

我想知道C++语言标准针对以下情况指定的规则:longx=200;shorty=static_cast(x);y是否保证为200,还是标准将其留给实现来决定?各种编译器对标准的遵守程度如何? 最佳答案 在本例中为static_cast是一个“显式类型转换”。该标准对4.7/3“积分转换”中的积分转换有这样的说法:Ifthedestinationtypeissigned,thevalueisunchangedifitcanberepresentedinthedestinationtype(andbit-fieldwidth);othe

c++ - 在 C++ 中获取变量地址的最可移植和可靠的方法

使用&如果变量类型已重载,获取变量地址可能会出现问题operator&().例如,_com_ptr_有operator&()重载修改对象的副作用。现在我有一组复杂的模板,其功能如下:templatevoidprocess(constT*object){//whatever}templatevoidtryProcess(T&object){process(&object)}在tryProcess()我需要一个T*指针保存T类型的实际对象的地址.tryProcess()的上述实现只有在classT时才能正常工作没有operator&()重载。所以如果我调用tryProcess>()我可以获

c++ - 需要澄清 C 风格、重新解释和 const 转换

我假设C风格的转换(不鼓励)只是reinterpret_casts是对的吗?使用后者在寻找令人讨厌的转换时在视觉上引人注目并且易于搜索,因此推荐使用C风格转换?如果使用const_cast放弃const并写入原始const对象是未定义的,那么const_cast的目的是什么?注意:我知道Bjarne正确地谴责转换操作是不安全的,甚至达到了声明“丑陋操作应该具有丑陋语法形式的程度。“因此C++中转换运算符的冗长。所以我会尽量减少它们的使用。promise。:) 最佳答案 没有。C转换可以执行与const_cast、static_cas

c++ - 如何摆脱空指针

我继承了一个最初用C编写的大型应用程序(但同时也向其中添加了很多C++)。由于历史原因,该应用程序包含大量空指针。在你开始窒息之前,让我解释一下为什么这样做。应用程序包含许多不同的数据结构,但它们存储在“通用”容器中。现在我会为它使用模板化的STL容器,或者我会给所有数据结构一个公共(public)基类,这样容器就可以存储指向基类的指针,但是在[好?]旧的C时代,唯一的解决方案是将结构指针转换为空指针。此外,还有很多代码处理这些空指针,并使用非常奇怪的C构造来模拟C中的多态性。我现在正在修改应用程序,并试图摆脱void-pointers。向所有数据结构添加一个公共(public)基类并

c++ - 编译器切换到禁用 c 风格转换中的 const_cast 语义?

最近我偶然发现了这样的代码:voidfoo(constBar*b){...takes_nonconst_param_fn((Bar*)b);...显然,开发人员并不知道他在做什么,但如果编译器没有默默地接受c-style-cast并且至少需要一个适当的const_cast,他可能已经知道了在提交之前两次。所以这让我开始思考,现代编译器是否有一个开关来防止const_castc风格转换的语义?防止所有c-style-casts的出现根本不切实际,允许它们的static_和reinterpret_语义是必要的邪恶(如果仅用于某些库代码),但我的印象是,在C++代码库中,合法使用c-styl

c++ - std::is_convertible 用于 type_info

在C++11中,可以通过usingstd::is_convertible确定类型A的变量是否可以隐式转换为类型B.如果你真的知道类型A和B,这很有效,但我只有type_infos。所以我正在寻找的是这样的功能:boolmyIsConvertible(consttype_info&from,consttype_info&to);是否可以在C++中实现类似的东西?如果是,怎么办? 最佳答案 在可移植的C++中做你想做的事是不可能的。可能如果您将自己限制在给定的平台上,则有可能获得部分答案。例如那些遵守ItaniumABI的平台将实现此功

c++ - static_cast 从基析构函数到指向派生类的指针的安全性

这是问题的变体DowncastingusingtheStatic_castinC++和Safetyofinvaliddowncastusingstatic_cast(orreinterpret_cast)forinheritancewithoutaddedmembers关于~B中的行为,我不清楚标准中的短语“B实际上是D类型对象的子对象,结果指针指向D类型的封闭对象”。如果在~B中转换为D,此时它仍然是子对象吗?以下简单示例显示了问题:voidf(B*b);classB{public:B(){}~B(){f(this);}};classD:publicB{public:D(){}};s

c++ - 使用多重继承进行转换

如果您有一个void*指针指向继承自BaseA和BaseB的派生类,编译器如何转换void*指向BaseA*(或BaseB*)的指针而不知道void*指针是Derived类型? 最佳答案 事实并非如此。使用static_cast与void*进行转换时的唯一保证是:Avalueoftypepointertoobjectconvertedto"pointertocvvoid"andbacktotheoriginalpointertypewillhaveitsoriginalvalue(C++03§5.2.9/10).例如,下面的代码是不