草庐IT

Implicit_cast

全部标签

C++20 bit_cast 与 reinterpret_cast

根据ISOC++委员会的最后一次session,bit-cast将在C++20标准中引入。我知道reinterpret_cast不适合这份工作,因为typealiasingrules但我的问题是,为什么他们选择不扩展reinterpret_cast以将对象视为位序列表示,而更愿意将此功能作为一种新的语言结构提供? 最佳答案 嗯,有一个明显的原因:因为它不会做bit_cast所做的所有事情。即使在我们可以在编译时分配内存的C++20世界中,reinterpret_cast也被禁止在constexpr函数中使用。bit_cast的明确目

c++ - 使 auto_cast 安全

GMan已发布deliciousauto_cast“operator”的代码允许在C++中编写如下代码:floatf=4.0f;inti=auto_cast(f);//insteadof:intj=static_cast(f);或者,更重要的是,Tx=value;typenamenested_type::typey=auto_cast(x);//insteadoftypedeftypenamenested_type::typemy_type;my_typez=static_cast(x);基本上,操作符非常擅长从static_cast中删除不必要的冗余,同时仍然是安全。它甚至比stat

c++ - 与 dlopen/dlsym 一起使用时 dynamic_cast 失败

简介让我为这个冗长的问题提前道歉。它尽可能短,不幸的是,它不是很短。设置我定义了两个接口(interface),A和B:classA//Aninterface{public:virtual~A(){}virtualvoidwhatever_A()=0;};classB//Anotherinterface{public:virtual~B(){}virtualvoidwhatever_B()=0;};然后,我有一个共享库“testc”,它构造C类的对象,实现A和B,然后传递指向它们的A接口(interface)的指针:classC:publicA,publicB{public:C();~

c++ - static_cast<Derived *>(Base pointer) 是否应该给出编译时错误?

static_cast(Basepointer)是否应该给出编译时错误?classA{public:A(){}};classB:publicA{public:B(){}};intmain(){A*a=newA();B*b=static_cast(a);//CompileError?} 最佳答案 它不会给出编译时错误,因为Base-Derived关系可以在运行时存在,具体取决于被强制转换的指针的地址。static_cast总是成功,但如果你不转换为正确的类型,则会引发undefined-behavior。dynamic_cast可能会

c++ - 为什么 const_cast 删除指针的 constness 而不是指向 const 的指针?

我了解const_cast适用于指针和引用。我假设const_cast的输入应该是一个指针或引用。我想知道如果输入是对constint的指针/引用,为什么它不会删除constness?以下代码按预期工作。const_cast带多级指针intmain(){usingstd::cout;#defineendl'\n'constint*ip=newint(123);constint*ptr=ip;*const_cast(ptr)=321;cout但是当我尝试使用指向constint的指针或引用constint时,值似乎没有改变。const_cast引用constintintmain(){us

C++:为什么 const_cast 是邪恶的?

我一直听到这种说法,但我真的找不到const_cast邪恶的原因。在以下示例中:templatevoidOscillatorToFieldTransformer::setOscillator(constSysOscillatorBase&src){oscillatorSrc=const_cast*>(&src);}我正在使用引用,并且通过使用const,我可以保护我的引用不被更改。另一方面,如果我不使用const_cast,代码将无法编译。为什么const_cast在这里不好?同样适用于以下示例:templatevoidSysSystemBase::addOscillator(cons

c++ - C++ 规范是否说明了如何在 static_cast/const_cast 链中选择类型以用于 C 样式转换?

这个问题涉及我在尝试回答thisearlier,intriguingquestionaboutC-stylecastsandtypeconversions时在C++规范中注意到的内容。.C++规范在§5.4中讨论了C风格的强制转换。它表示强制转换符号将按此顺序尝试以下强制转换,直到找到一个有效的强制转换:const_caststatic_caststatic_cast紧随其后的是const_castreinterpret_castreinterpret_cast紧随其后的是const_cast.虽然我对使用static_cast的含义有一个非常直观的想法。后跟const_cast(例如

c++ - static_cast 被滥用了吗?

我对static_cast的感受很复杂,因为它是可用的最安全的C++强制转换,但同时允许安全和不安全转换,所以你必须知道上下文来说明它是否真的安全或可能导致UB(例如,当强制转换为子类时)。那么为什么没有更安全的显式转换呢?这是一个示例,它可能有用。在COM中,它们必须将接口(interface)指针返回为void**ppv,所以“必须”明确地转换*ppv=(IInterface*)this;后来建议用更安全的C++强制转换*ppv=static_cast(this);但是,即使是static_cast也有意义吗?这里?this是派生自IInterface的类,所以可以简单地写IInt

c++ - 使用 boost::numeric_cast<>

当我想在不同的整数类型之间进行转换时,似乎最好的语法是使用boost::numeric_cast():inty=99999;shortx=boost::numeric_cast(y);//willthrowanexceptionifyistoolarge我从来没有用过;但是语法非常简单,所以一切都很好。现在假设我想做一些更高级的事情:我希望它返回目标类型的最小值或最大值(饱和度),而不是抛出异常。我想不出一种表达方式,但是documentation表明这是可能的(可能使用RawConverter策略)。我能想到的只是以下丑陋的:shortx=numeric_cast(max(min(y

c++ - static_cast 和 Implicit_cast 有什么区别?

什么是implicit_cast?我什么时候应该更喜欢implicit_cast而不是static_cast? 最佳答案 我正在复制我对answerthiscomment的评论在另一个地方。Youcandown-castwithstatic_cast.Notsowithimplicit_cast.static_castbasicallyallowsyoutodoanyimplicitconversion,andinadditionthereverseofanyimplicitconversion(uptosomelimits.you