草庐IT

Reinterpret_cast

全部标签

c++ - 非多态类型上的 Dynamic_cast

我能理解为什么dynamic_cast在这种情况下有效:#includestructA{virtual~A()=default;};structB{virtual~B()=default;};structC:A,B{};voidf(constA&a){if(autop=dynamic_cast(&a))std::cout但是为什么如果你从B中删除多态性它仍然有效:#includestructA{virtual~A()=default;};structB{};structC:A,B{};voidf(constA&a){if(autop=dynamic_cast(&a))std::cout

C++ std::forward<T> 与 static_cast<T>

据我了解,std::forward(x)相当于static_cast(x).但据我所见,static_cast(x)似乎做同样的事情,如下所示code因此我的问题是为什么std::forward实现为static_cast(x),而不是static_cast(x),如果两者有相同的效果呢? 最佳答案 因为完美转发允许同时传递r值引用和l值引用。这是通过referencecollapsing完成的:T=int-->T&&=int&&T=int&-->T&&=int&&&=int&T=int&&-->T&&=int&&&&=int&&在

c++ - 通过 const_cast 删除 const 并调用不修改结果对象的非 const 函数是否安全?

我知道丢弃const-ness应该小心,任何试图从最初的const中删除const-ness的尝试对象后跟修改对象导致未定义的行为。如果我们想删除const-ness以便我们可以调用不修改对象的非const函数怎么办?我知道我们实际上应该将此类函数标记为const,但假设我使用的是没有可用const版本的“错误”代码。那么,总而言之,下面的代码“安全”吗?我的猜测是,只要您最终不修改对象就没问题,但我不是100%确定。#includestructFoo{voidf()//doesn'tmodifytheinstance,althoughisnotmarkedconst{std::cou

c++ - 我避免 dynamic_cast<> 的方法是否比 dynamic_cast<> 本身更快?

我正在回答question几分钟前,它向我提出了另一个问题:在我的一个项目中,我做了一些网络消息解析。消息采用以下形式:[1bytemessagetype][2bytespayloadlength][xbytespayload]有效载荷的格式和内容由消息类型决定。我有一个基于公共(public)类的类层次结构Message.为了实例化我的消息,我有一个返回Message*的静态解析方法取决于消息类型字节。像这样的东西:Message*parse(constchar*frame){//Thisissamplecode,inreallifeIobviouslycheckthatthebuf

c++ - 用户定义类型的 static_cast

这可能吗?为什么要这么做?classFoo;classBar;......Foofoo;Barbar=static_cast(foo);通常static_cast用于数字类型和指针,但它可以用于用户定义的数据类型,也就是类吗? 最佳答案 Barbar=static_cast(foo);此转换将失败。Foo和Bar是不兼容的类型,除非至少满足以下条件之一:Foo派生自Bar,或者Bar有一个接受Foo或Or的构造函数Foo具有到Bar的用户定义转换。这里更大的问题不是它是否会成功转换。更大和实际的问题应该是:你想从这样的Actor阵容

c++ - 我可以举一个现实生活中的例子,其中通过 void* 进行强制转换而 reinterpret_cast 无效吗?

有一组关于交叉转换的问题(从T1*转换为不相关的T2*),例如this和this.答案通常是这样的:reinterpret_cast是实现定义的,转换为void*后跟static_cast是明确定义的。然而,我还没有看到使用reinterpret_cast时可能出错的任何真实示例。通过void*进行强制转换而reinterpret_cast无效的真实示例有哪些? 最佳答案 real-lifeexampleswherecastingthroughvoid*worksandreinterpret_castdoesn't如果我将这句话解释

c++ - SFINAE: 'static_cast<void>()' 或 ', void()'?

在任意类型上执行SFINAE时,通常需要将表达式的结果转换为void。我见过两种方法;转换为无效:(void)(expr)//orstatic_cast(expr)或者,或者,使用带有voidprvalueRHS的逗号运算符:(expr),void()据我了解,在这两种情况下,expr都会被求值(为了格式良好,在非求值上下文中)并丢弃结果(或结果类型,在非求值上下文中);在任何一种情况下,即使是病态类T也无法覆盖T::operatorvoid()或operator,(T,void)。(参见:Whyis"operatorvoid"notinvokedwithcastsyntax?、Wha

c++ - 如何将 constexpr 指针设置为物理地址

在嵌入式编程中,您经常需要设置指向物理地址的指针。地址不可重定位且固定。这些不是由链接器设置的,因为它们通常代表寄存器或在这种情况下位于OPT存储器中预定地址的校准数据。该数据是在芯片制造商首次在生产中测试设备时设置的。所以第一次尝试是:staticconstexpruint16_t*T30_CAL=reinterpret_cast(0x1FFFF7B8u);但这会导致在GCC下出现以下警告/错误,并且根据标准(c++14)是“非法的”。..xyz/xxxx/calibration.cpp:23:40:错误:从整数到指针的reinterpret_cast现在我可以捏造它了constex

c++ - 使用指针将 char* 转换为 unsigned char*

我正在编写一些使用fstreamread()函数的代码,该函数需要一个char*作为缓冲区。稍后,我想将此缓冲区中的字节作为无符号字符使用,因此我要么必须:1.将缓冲区声明为char*,然后稍后为每个元素执行static_casts,2.声明缓冲区作为unsignedchar*然后在我将它传递给读取函数时执行reinterpret_cast,或者3.将缓冲区声明为char*并创建一个转换指针,我将其用于将缓冲区作为unsignedchar进行访问。这是一个片段:char*buf=newchar[512];unsignedchar*ubuf=reinterpret_cast(buf);f

c++ - dynamic_cast vs static_cast 无效*

在下面程序的最后两行中,static_cast和dynamic_cast表现不同。据我了解,dynamic_cast的结果始终解析为完整对象的地址。所以它以某种方式使用了RTTI。谁能解释一下编译器如何使用RTTI来区分两者。#includeusingnamespacestd;classTop{protected:intx;public:Top(intn){x=n;}virtual~Top(){}friendostream&operator(&b)(&b);cout(p)(p)可能的输出:https://ideone.com/WoX5DI281,2,3,40xbfcce60410xbf