草庐IT

auto_cast

全部标签

c++ - 为什么 C++ 引入 duration_cast 而不是使用 static_cast?

我正在查看一些使用duration_cast的代码。看着它,我想知道为什么不使用static_cast,因为static_cast在生活中的目的是在类型之间进行转换。为什么C++需要一个新的运算符来在时间之间进行转换?为什么未使用static_cast?也许我不理解C++在毫秒、微秒、纳秒等之间产生的差异。出于某种原因,我认为答案很明显或在StackOverflow上进行了讨论,但我没有找到了(还)。 最佳答案 在不存在精度损失风险的情况下,已经存在时间间隔的直接转换。duration_cast在存在精度损失风险时是必需的。dura

c++ - 为什么 static_cast 不使用转换运算符指向 const 的指针?

来self的包装类Pointer我只想返回指向const的指针:Baseconst*.类型转换时Pointer至Derivedconst*我收到一个编译错误:errorC2440:'static_cast':'Pointer'cannotbeconvertedto'constDerived*'(译自德语VS2012)structBase{};structDerived:publicBase{};templateclassPointer{public:Pointer(T*t=nullptr):p(t){}//operatorT*(){returnp;}operatorTconst*()c

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++ - const auto * 和 const auto 之间的区别?

我有这个代码:constinta=10;constauto*b=&a;//0x9ffe34constautoc=&a;//0x9ffe34intz=20;b=&z;//0x9ffe38//c=&z;//[Error]assignmentofread-onlyvariable'c'为什么可以将新地址分配给b而不是分配给c? 最佳答案 b将被推导出为constint*,这意味着一个指向constint的非常量指针>,所以改变b本身的值就可以了。c将被推导出为constint*const,这意味着一个const指针指向constint,所

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++ - 当 auto 遇到多态和虚函数时,正确的行为是什么?

classB{public:virtualvoidf(){printf("B\n");}};classD:publicB{public:voidf(){printf("D\n");}};intmain(void){B*d=newD();d->f();autob=*d;b.f();}对于d->f();,输出是D。这是正确的。但是对于b.f();,输出是B。这样对吗? 最佳答案 Isthisright?没错,类型是在编译时推导的。auto使用与templateargumentdeduction相同的规则对于类型推导,基于静态类型,不考虑

c++ auto 多选

在我的项目冒险过程中,我意识到如果我想根据条件初始化参数,我不能利用新的c++11auto关键字的优势。基本上我有这样一个代码片段:autofoo=bar::getfoo();需要更改为:FOOfooif(cond){foo=bar::getfoo();}else{foo=baz::getotherfoo();}但是我需要用类型声明foo(因为编译器不知道我将使用相同的类型返回。我想知道在这种情况下是否有任何使用auto关键字的方法。我想出的另一个解决方案是使用?:具有这样代码的运算符:autofoo=cond?bar::getfoo():baz::getotherfoo();但是如果

c++ - std::auto_ptr、delete[] 和泄漏

为什么这段代码不会导致内存泄漏?intiterCount=1000;intsizeBig=100000;for(inti=0;ibuffer(newchar[sizeBig]);}WinXPsp2,编译器:BCB.05.03 最佳答案 因为你(不)幸运。auto_ptr调用delete,而不是delete[]。这是未定义的行为。尝试做这样的事情,看看你是否幸运:structFoo{char*bar;Foo(void):bar(newchar[100]){}~Foo(void){delete[]bar;}}intiterCount=1

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