草庐IT

auto_cast_wrapper

全部标签

现代C++中的decltype(auto):理解与运用

在C++14及以后的版本中,decltype(auto)成为了编译器和开发者的得力助手。它主要用于在编译时推断表达式的类型,并保证推断出的类型在上下文中是有效的。decltype(auto)比传统的decltype更强大,因为它能够处理更为复杂和动态的类型。decltype(auto)的工作原理decltype(auto)会根据初始表达式的类型进行推断,并在必要时对推断出的类型进行调整,以确保类型安全和一致性。例如,如果初始表达式是一个数组,decltype(auto)将推断出数组的元素类型;如果初始表达式是一个函数,decltype(auto)将推断出函数的返回类型。decltype(aut

c++ - reinterpret_cast 什么时候修改位?

来自C++标准:5.2.10.3Themappingperformedbyreinterpret_castmight,ormightnot,producearepresentationdifferentfromtheoriginalvalue.我在这个网站接受过培训,相信并重复这一点。(即使可能只是琐事)。从float*到int*的reinterpret_cast被允许产生不同的位模式。唯一的保证是reinterpret_cast将结果返回到float*将产生原始位模式。我的问题:这会发生吗?是否存在实际reinterpret_cast为不同位模式的现有真实平台或CPU或编译器?如果不

c++ - 共享库中模板化类和 dynamic_cast 的显式实例化

今天我遇到了一个我似乎无法解决的问题。我正在编译一个共享库,其中包含一个模板化类(Derived,其基础是Base)和此类的一些显式实例化。我希望图书馆用户从这个模板化类中扩展。当我尝试dynamic_cast时出现问题来自Base*的用户实例至Derived*.我已经将问题缩小到这个MWE:共享库包含以下文件:Base.h#ifndefBASE_H_#defineBASE_H_classBase{public:Base();virtual~Base();};#endif/*BASE_H_*/Derived.h#ifndefDERIVED_H_#defineDERIVED_H_#inc

c++ - cast 运算符函数在 g++ 中编译良好,但在其他编译器中则不然。为什么?

这个问题在这里已经有了答案:Operatorcast,GCCandclang:whichcompilerisright?(1个回答)关闭6年前。考虑以下程序:structS{usingT=float;operatorT(){return9.9f;}};intmain(){Sm;S::Tt=m;t=m.operatorT();//Isthiscorrect?}程序在g++中编译良好(参见现场演示here)但它在clang++、MSVC++和IntelC++编译器中编译失败clang++给出以下错误(参见现场演示here)main.cpp:8:20:error:unknowntypenam

c++ - 模板类中 auto 的不完整类使用

下面的代码格式是否正确?classB;templateclassA{Bdo_f()const;friendautof(Aconst&a){returna.do_f();}//#1};classB{};templateBA::do_f()const{returnB{};}intmain(){Aa;f(a);}如果我将#1​​中的auto更改为B,我会收到不完整的类型错误消息。为gcc/clang使用auto编译DemoB失败Demo 最佳答案 [dcl.fct.def.general]/2:Thetypeofaparameterort

c++ - reinterpret_cast 更改指针值的任何真实示例?

根据C++标准,指针T*到其他类型指针Q*的reinterpret_castcanchangeornotchangethepointervalue取决于实现。我非常感兴趣-是否有任何真实的C++实现示例,其中使用reinterpret_cast将指针转换为其他指针类型会更改指针?那里发生了什么变化以及为什么发生变化? 最佳答案 请注意,当标准声明它可以或不能做某事时,并不意味着当前有任何实现具有该行为,只是它们可以。我能想到的最接近的是硬件要求类型对齐的架构,以及决定在需要时纠正对齐的实现。像这样的东西:aligned8var;al

c++ - `auto` 的 ref- 和 cv-stripping 属性。

我学会了以这种方式使用auto声明一个变量autovar=expr;基本上就像获取expr的类型并从中剥离&/&&-references和所有顶级常量和volatile。这是否意味着上面的行完全等同于下面的行?std::remove_cv::type>::typevar=expr; 最佳答案 不,那不是真的。autovar=expr;更像是传递expr按值(value)。intx[1];autoy=x;这使得y一个int*.主要是autox=expr;表现得像模板类型推导:templatevoidf(T);intx[1];f(x);

c++ - C++1 7's deduced ` auto` 非类型 `template` 参数是否可以使用显式非类型参数模式匹配模板?

考虑这个例子(alsoavailableonwandbox):templateclass>voidtest(){}templatestructX{};正在尝试实例化test()在clang++4.0(trunk)导致编译错误:error:nomatchingfunctionforcallto'test'test();^~~~~~~note:candidatetemplateignored:invalidexplicitly-specifiedargumentfor1sttemplateparametervoidtest(){}我最初的假设/直觉是test可用于匹配任何template具

c++ - static_cast 到相同类型会引入运行时开销吗?

我有一个结构模板,它采用两种类型(T和S),并且在某些时候使用static_cast从一种类型转换键入另一个。通常情况下,T和S是同一类型。设置的简化示例:templatestructfoo{voidbar(Tval){/*...*/some_other_function(static_cast(val));/*...*/}};在S与T是同一个类的情况下,static_cast是否会引入额外的开销,或者它是否为null哪个操作总是会被忽略?如果它确实引入了开销,是否有一个简单的模板元编程技巧来仅在需要时执行static_cast,或者我是否需要创建部分特化来处理T==S案例?如果可能,

c++ - c++ 中的复杂 dynamic_cast

我在C++中有以下情况:抽象基类Abstract1和Abstract2。它们是无关的。类Foo派生自Abstract1和Abstract2我在一个编译单元中,我没有关于类Foo的信息(没有声明,没有定义)。只有Abstract1和Abstract2是已知的。(实际上,Foo甚至定义在一个DLL中)dynamic_cast是否允许从Abstract1*转换为Abstract2*?这是标准吗? 最佳答案 你所描述的是所谓的cross-cast。对于dynamic_cast(v),标准在[expr.dynamic.cast]/8中指定If