草庐IT

Implicit_cast

全部标签

c++ - C++ 中的 const_cast 规则

structfoo{constintA;intB;foo():A(10),B(20){}};voidmain(){foof1;const_cast(f1.A)=4;//line1constfoof2;const_cast(f2.B)=4;//line2}第1行和第2行是否都表现出未定义的行为?如果f1和f2是上面代码中列出的类型的shared_ptr,行为会有所不同吗? 最佳答案 两者的行为const_cast(f1.A)=4和const_cast(f2.B)=4未定义。如果一个对象最初定义为const,然后你扔掉了const-ne

C++我们什么时候应该更喜欢使用两个链接的static_cast而不是reinterpret_cast

首先,这不是Whydowehavereinterpret_castinC++whentwochainedstatic_castcandoit'sjob?的拷贝.我知道我们甚至不能使用两个链式static_cast来实现的情况,reinterpret_cast所做的。但是在任何情况下我应该更喜欢两个链接的static_cast而不是简单且更具可读性的reinterpret_cast? 最佳答案 reinterpret_cast应该是一个巨大的闪烁符号,表示这看起来很疯狂,但我知道我在做什么。不要因为懒惰而使用它。reinterpret

c++ - 为什么 dynamic_cast 是邪恶的还是不邪恶的?在这种情况下我应该使用 dynamic_cast 吗?

有人说theuseofdynamic_castoftenmeansbaddesignanddynamic_castcanbereplacedbyvirtualfunctions为什么使用dynamic_cast被认为是糟糕的设计?假设我有函数名称func(Animal*animal,intanimalType),func中的实现如下:boolfunc(Animal*animal,intanimalType){.../*AnimalisthebaseclassofBear,Panda,Fish....dynamic_castanimaltorealanimals(Bear,Panda,F

c++ - reinterpret_cast<char *> 是 reinterpret_cast 的唯一有效用法吗?

我最近了解到C++标准包含“严格的别名规则”,它禁止通过不同类型的变量引用相同的内存位置。但是,该标准确实允许char类型合法地别名任何其他类型。这是否意味着reinterpret_cast只能合法地用于转换为char*或char&类型?我相信严格的别名允许在继承层次结构中的类型之间进行转换,但我认为这些情况倾向于使用dynamic_cast?谢谢 最佳答案 reinterpret_cast有许多不同的用途。cppreferencepage列出了11个不同的案例。我猜你只是在询问情况5和6:将T*转换为U*,并将T转换为你&.在这些

c++ - 为什么虚函数调用比 dynamic_cast 快?

我写了一个简单的例子,估计调用虚函数的平均时间,使用基类接口(interface)和dynamic_cast和调用非虚函数。这是它:#include#include#include#include#defineCALL_COUNTER(3000)__forceinlineintsomeFunction(){return5;}structBase{virtualintvirtualCall()=0;virtual~Base(){};};structDerived:publicBase{Derived(){};virtual~Derived(){};virtualintvirtualCal

c++ - 多重继承 : unexpected result after cast from void * to 2nd base class

我的程序需要使用void*以便在动态调用情况下传输数据或对象,以便它可以引用任意类型的数据,甚至原始类型。但是,我最近发现,在具有多个基类的类的情况下向下转换这些void*的过程失败,甚至在调用这些向下转换的指针上的方法后我的程序崩溃,即使内存地址看起来是正确的。崩溃发生在访问“vtable”期间。所以我创建了一个小测试用例,环境是MacOSX上的gcc4.2:classShape{public:virtualintw()=0;virtualinth()=0;};classSquare:publicShape{public:intl;intw(){returnl;}inth(){ret

c++ - 我应该在 C 风格的转换中使用 C++ reinterpret_cast 吗?

我有以下模板函数用于将任何标准类型的数据转储到二进制输出流中。templatestaticvoiddump(constT&v,ostream&o){o.write(reinterpret_cast(&v),sizeof(T));}除了reinterpret_cast,我还可以使用C风格(constchar*)。使用reinterpret_cast有什么特别的理由吗?我读了一些其他帖子,其中reinterpret_cast不受欢迎。但是上面的用法是合法的,不能用别的代替,对吧? 最佳答案 C风格转换的问题在于它们在幕后做了很多事情。有

c++ - const_cast VS 可变的?有什么不同吗?

根据我的理解,mutable取消了变量的constnessClassA{voidfoo()const{m_a=5;}mutableintm_a;};还有const_cast:voidprint(char*str){cout(c));return0;}那么,是什么改变了彼此?谢谢 最佳答案 const_cast无法取消对象的常量性。const_cast只能从对象的访问路径中移除constness。访问路径是对对象的指针或引用。从访问路径中删除常量性对对象本身绝对没有影响。即使您使用const_cast移除访问路径的常量性,仍然不一定会

c++ - 静态 const 成员的 const_cast

以下代码在GCC(4.2-4.6)和Clang(2.1)下都能很好地编译,但是当我运行可执行文件时,它会显示“总线错误:10”。我不明白原因。#includestructA{staticintconstv;A(){++*const_cast(&A::v);}};intconstA::v=0;intmain(intargc,char*argv[]){Aa,b,c;std::cout 最佳答案 我认为相关的引用是:§7.1.6.1(4)fromN3242:Exceptthatanyclassmemberdeclaredmutableca

c++ - 避免 dynamic_cast/RTTI

我最近正在为一个副项目(cpp-markdownlibrary,出于好奇)编写一段C++代码,遇到了一个编码问题,我想听听一些意见。cpp-markdown有一个名为Token的基类,它有许多子类。两个主要的子类是Container(包含其他Token的集合)和TextHolder(用作Token的基类当然是包含文本的)。大部分处理是通过虚函数处理的,但其中一些处理在单个函数中处理效果更好。为此,我最终使用dynamic_cast将指针从Token*向下转换为它的子类之一,这样我就可以调用特定于子类的函数,并且它的子类。转换不可能失败,因为代码能够通过虚函数(例如isUn​​match