草庐IT

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 风格转换中的 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++ - 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++ - 是否尝试修改 const_cast-ed,但动态分配的常量对象仍然是未定义的行为?

这个问题在这里已经有了答案:Canaheap-allocatedobjectbeconstinC++?(6个答案)关闭7年前。例如:constint*pc=newconstint(3);//notetheconstint*p=const_cast(pc);*p=4;//undefinedbehavior?特别是,编译器能否优化掉分配给堆的*pc?如果不是,尝试通过p修改*pc是否仍然构成未定义的行为-如果是,为什么?

c++ - 如何使用 dynamic_cast 正确向下转换?

我对dynamic_cast很困惑.来自C++Primer和cppreference的Material(规则5)不能帮助我理解。(cppreference比书难得多,我都非常仔细地阅读了它们)来自C++Primer5th:dynamic_cast(e)Inallcases,thetypeofemustbeeitheraclasstypethatispubliclyderivedfromthetargettype,apublicbaseclassofthetargettype,orthesameasthetargettype.Ifehasoneofthesetypes,thentheca

c++ - dynamic_cast 通常是如何实现的?

类型检查仅仅是整数比较吗?或者有一个GetTypeId虚拟函数来区分哪个使其成为整数比较有意义吗?(只是不想让事情成为类名上的字符串比较)编辑:我的意思是,如果我经常期待错误的类型,使用类似的东西是否有意义:structToken{enum{AND,OR,IF};virtualstd::size_tGetTokenId()=0;};structAndToken:publicToken{std::size_tGetTokenId(){returnAND;}};并使用GetTokenId成员而不是依赖于dynamic_cast。 最佳答案

c++ - 在编译时填充 std::array 和 const_cast 可能的未定义行为

已知std::array::operator[]由于C++14是constexpr,请参见下面的声明:constexprconst_referenceoperator[](size_typepos)const;但是,它也是const限定的。如果您想使用std::array的下标运算符以便在编译时为数组赋值,这会产生影响。例如考虑以下用户文字:templatestructFooLiteral{std::arrayarr;constexprFooLiteral():arr{}{for(inti(0);i如果您尝试声明类型为FooLiteral的constexpr变量,上述代码将无法编译。这

c++ - `std::any_cast` 返回拷贝

我正在阅读documentationforstd::any_cast我觉得很奇怪,API让转换要么返回一个值给持有的对象,要么返回一个指向它的指针。为什么不返回引用?每次使用非指针类型参数调用函数时都需要创建一个拷贝。我可以看到指针版本的转换可能更能表明意图,也可能更清晰,但为什么不让返回值成为这样的引用呢?templateValueType&any_cast(any*operand);代替templateValueType*any_cast(any*operand);此外,即使您请求引用,强制转换也会删除引用并将拷贝返回到存储的对象,请参阅此处对函数重载1-3的返回值的解释http:

c++ - 如何使用 boost::any_cast 转换为基本类型?

我正在使用boost::any来获得多态类型,我需要能够将对象转换为其基类型。classA{public:intx;virtualintfoo()=0;};classB:publicA{public:intfoo(){returnx+1;}};intmain(){B*bb=newB();boost::anyany=bb;bb->x=44;A*aa=boost::any_cast(any);}main函数的代码在运行时抛出如下错误:terminatecalledafterthrowinganinstanceof'boost::exception_detail::clone_impl>'w

c++ - dynamic_cast 中的类型必须是指向完整类类型的指针或引用,或者 void *

我希望有人能理解为什么下面的代码会失败。我正在尝试从osg::Node*节点对象获取PositionAttitudeTransform(Openscenegraph类)的实例。但是下面是粗体的编译器错误。voidCameraPosCallbackUpdate::operator()(osg::Node*node,osg::NodeVisitor*nv){//othercodegoeshereosg::PositionAttitudeTransform*pat=dynamic_cast(node);}IntelliSense:dynamic_cast中的类型必须是指针或对完整类类型的引用