在下面程序的最后两行中,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
我有一个类模板A其中包含一个指针容器(T*):templateclassA{public://...private:std::vectordata;};还有一堆函数,比如:voidf(constA&);voidg(constA&);通过来自A的转换调用这些函数是否可以?至A?Aa;...auto&ac=reinterpret_cast&>(a);f(ac);我很确定这段代码有未定义的行为。在现实生活中使用这种转换是否危险? 最佳答案 尽管reinterpret_cast本身可能是未指定的行为,但在完成转换后尝试访问参数是未定义的行为
我觉得防止std::reference_wrapper默认构造使其更难使用,即使使用默认构造的reference_wrapper会导致运行时异常。然而,一个reference_wrapper是完全可复制的,因此它的值始终可以更改,那么为什么要阻止它默认具有the空引用?它使许多用例变得更加简单,并且有了它,建议的observer_ptr不再需要-为什么需要冗余?默认构造reference_wrapper会统治他们!想法? 最佳答案 However,areference_wrapperisperfectlycopyable,soit'
我在看https://en.cppreference.com/w/cpp/language/reinterpret_cast我注意到它指定了我们始终可以转换为的合法类型:字节*char*unsignedchar*但是我没有在列表中看到void*。这是疏忽吗?我的用例需要reinterpret_cast,因为我正在从int**转换为void*。我最终将从void*转换回int**。 最佳答案 这些类型不受严格的别名规则约束。这并不意味着它们是您可以与reinterpret_cast一起使用的唯一类型.在将对象指针转换为另一种对象指针类
我想要一个std::vector的排序View但我不想修改原始容器。std::reference_wrapper看起来很适合这个,它对整数vector也适用。我创建了这个小例子:#include#include#include#include#includeintmain(){std::vectornumbers{1,42,3,9,5};std::vector>sorted_numbers(numbers.begin(),numbers.end());std::sort(sorted_numbers.begin(),sorted_numbers.end());std::coutdura
const_cast真的只是告诉编译器“停止提示,将其视为非常量指针”的一种方式吗?有没有const_cast本身被翻译成实际机器代码的情况? 最佳答案 不,它只是在编译时删除了const属性。 关于c++-const_cast是否会导致实际的代码排放?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/759315/
鉴于auto的以下用法:std::vectorv;for(autoi=0;i对于C++来说,推导i将是理想的选择作为std::vector::size_type,但如果它只查看i的初始化程序,它会看到一个整数。i的推导类型是什么?在这种情况下?这是auto的适当用法吗?? 最佳答案 使用decltype而不是auto来声明i。for(decltype(v.size())i=0;i更好的是,如@MarkB的回答所示,使用迭代器迭代vector。 关于C++11auto和size_type,
所以我理解在C#中使用var是有意义的,因为你有编译器派生的匿名类型。C++似乎没有此功能(除非我错了),那么使用auto关键字有什么意义呢?(这有点酷,与C#不同,auto确实适用于成员/全局变量,我想这很酷,但似乎不足以证明它的存在)。 最佳答案 auto归结为通用编程和节省程序员的输入时有很多用途。例如,考虑这个。你愿意输入:std::unique_ptrg=std::make_unique(1,2,3,4)或:autog=std::make_unique(1,2,3,4)是的,它们都很长,但我们知道返回类型并再次指定它输入起
看看这个小片段:structA{virtual~A(){}};structB{};boolfn(){A*volatilea=newA;returndynamic_cast(a);}是否允许编译器完全删除dynamic_cast,并将dynamic_cast转换为简单的nullptr;?这个问题的原因是这个answer.注意事项:假定volatile意味着编译器不能假定任何有关a的信息,因为它是易变的。这是一个question为什么。dynamic_cast可能不允许被删除的事实是程序中某处可能有一个类型,它派生自A和B。 最佳答案
我对reinterpret_cast的心理模型一直是,将表达式的位序列视为不同类型,并且cppreference(注意:这不是C++标准的引用)似乎同意这一点:Unlikestatic_cast,butlikeconst_cast,thereinterpret_castexpressiondoesnotcompiletoanyCPUinstructions.Itispurelyacompilerdirectivewhichinstructsthecompilertotreatthesequenceofbits(objectrepresentation)ofexpressionasifi