图片分享网站建设,郑州一建第七项目部,电脑网站网页设计,制作视频软件哪个好文章目录 前言它们是什么通俗解释总结 前言
在C中提到推导第一个映入脑海的可能是“模板”#xff0c;当然有人也可能想到 auto#xff0c;这些都是和推导相关的语言语法#xff0c;再比如“完美转发”等等#xff0c;总是就是他们的类型不用明明白白的写出来#xff0c;… 文章目录 前言它们是什么通俗解释总结 前言
在C中提到推导第一个映入脑海的可能是“模板”当然有人也可能想到 auto这些都是和推导相关的语言语法再比如“完美转发”等等总是就是他们的类型不用明明白白的写出来可以利用一种简单的方式来定义比如 candidates 是一个字符串数组 如果遍历它我们可以写成 for (auto skillId : candidates)而不用将 skillId 变量定义成 const std::string这在一定程度上带来了便利今天的几个东东也是用于推导的我们一起来看看。
它们是什么
decltype、std::declval 和 std::decay_t 都是 C 标准库中的类型相关工具这些工具在 C 编程中提供了强大的类型推导和处理能力使得代码更加灵活。 decltype 是一个关键字用于从一个表达式中推导出其类型。它通常与表达式一起使用以便在编译时确定表达式的类型。例如 int x 5;
decltype(x) y 10; // y 的类型将被推导为 intdecltype 还可以用于推导函数返回类型以及在泛型编程中处理模板的类型。 std::declval 是一个函数模板用于在不实际调用构造函数的情况下生成一个对象引用以便在类型推导中使用。通常在需要引用某个类型的对象但实际无法创建该对象的上下文中使用例如在函数返回类型推导中 template typename T
auto createAndProcess() - decltype(std::declvalT().process()) {// 此处只是用于类型推导并不会实际创建 T 的对象
}在这个例子中std::declvalT().process() 用于推导函数的返回类型但并不会实际调用 process 函数。 std::decay_t 是一个类型转换工具模板用于将给定类型的衰变后的类型返回。衰变指的是将类型转换为其自然形式即去掉引用、添加 cv 限定符const 和 volatile。例如 using T1 std::decay_tint; // T1 为 int
using T2 std::decay_tconst int; // T2 为 int
using T3 std::decay_tint[]; // T3 为 int*std::decay_t 在模板编程中很有用因为它可以帮助去除类型的多余限定符使得函数模板的匹配更加精确。
通俗解释
如果看了上面的例子还是有点迷糊那我再解释的通俗一点 decltype 读音为 “dee-kluh-type”就是返回一个变量的类型比如你有一个对象 obj 想要再定义一个和它相同各类型的变量就可以写成 decltype(obj) newObj; std::declval 读音为 “standard dee-cl-val”它能返回类型 T 的右值引用其实是一个伪实例不会产生任何临时对象也不会因为表达式很复杂而发生真实的计算。因为不会真正的进行构造所以可以实现在元编程时伪构造一个没有定义默认构造函数类还可以避开纯虚基类不能实例化的问题说白了它就是假装创建个对象用于推导类型。 std::decay_t 读音为 “standard dee-kay tee”有点褪去外表直击内心的意味就是大家一起褪去花里胡哨的修饰符获得原始的类型用于函数模板的匹配更加精确比如判断类型 T 是不是intif constexpr (std::is_same_vstd::decay_tT, int)
总结
decltype 是关键字用于有了值或对象求类型的std::declval 是函数模板用于伪造一个对象但不实际构造的std::decay_t 是类模板用于去除修饰符获取原始类型的没想到decltype 居然是关键字结果一查发现C的关键字已经膨胀了下次总结一下 反爬链接请勿点击原地爆炸概不负责 当身边出现不和谐声音的时候问问自己是不是你把他们招来的用实力让他们闭嘴而不要视图通过语言让他们明白