std::declval 元函数

过年之无用知识研究:std::is_assignable中的declval<_Dest>() = declval<_Src>() 【代码】无用的知识又增加了:assignable means? 阅读详情

declval用于非求值上下文中
declval 原形:

template<typename _Tp>
  auto declval() noexcept -> decltype(__declval<_Tp>(0))
  {
    static_assert(__declval_protector<_Tp>::__stop,
	    "declval() must not be used!");
    return __declval<_Tp>(0);
  }
.....
template<typename _Tp>
  struct __declval_protector
  {
    static const bool __stop = false;
  };
....
template<typename _Tp, typename _Up = _Tp&&>
  _Up
  //因为传的是0(int类型),所以可引用的类型始终决策出这个版本(编译时多态)
  __declval(int);//利用SFINAE 使编译器能决策出最适合的版本 

template<typename _Tp>//void等不可引用的类型始终决策出这个版本
  _Tp
  __declval(long);//利用SFINAE 使编译器能决策出最适合的版本
  • __declval只有声明,没有定义;所以说用于求值上下文中会在链接时报错
    所以上面用了静态断言以提供更友好的错误信息;
  • __declval_protector 延迟实例化时机 用于防止无条件编译错误
  • 而在非求值上下文中使用时,不会对函数体内的语句进行检查,即不会执行静态断言,据此约束了使用场景;
  • ! 利用了函数返回值的特性, 对于__declval你传什么类型就返回什么类型的"实体", 注意:这种实例化并不是真正的在内存上构造出对象, 它在编译期非求值上下文中,仅仅是用于构造合法的语句
  • 注意返回类型不能写decltype(auto),虽然那样编译器也能推导出类型为decltype(__declval<_Tp>(0)); 但也意味着编译器需要看到函数体, 将触发函数体内的静态断言

用法1:求函数返回类型:

void commonF(int,double,char){};

template<class F,class... Args>//F:可调用对象 类型; Args:F的参数类型
  using InvokeResultOfFunc =
  decltype(declval<F>()(declval<Args>()...));
  
int main(){
//不仅可以用于普通函数, 还可用于函数对象的求返回类型
   InvokeResultOfFunc<float (int), int> a{};//a为float类型
   InvokeResultOfFunc<decltype(commonF), int,double,char> *b{};
}
C++11中std::declval的实现机制浅析 本文主要给大家介绍了关于C++11中std::declval实现机制的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 在vs2013中,declval定义如下 template <_Ty> typenamea dd_rvalue_reference<_Ty>::type declval() _noexcept; 其中,add_rvalue_reference为一个traits,定义为 template <_Ty> struct add_rvalue_reference { typedef _Ty&& type; } 可见,declval被定义为一个函数,并且只有申明,没有 立即下载

相关推荐

概率整形 Peobabilistic Shaping PS 第一节

概率整形概述 概率整形(Peobabilistic Shaping, PS)是一种针对于调制格式的优化技术,它为光通信通信提供了非常高的灵活性,但不会增加系统复杂性。尤其是光通信中的非线性问题会限制功率,使得PS就像为光通信量身定做的一样。 PS技术能够在不增加发送功率的前提下,获得高频谱效率和传输容量。2016年在使用PS技术的实验中实现了6600km单模光纤的65Tbit/s数据的传输。 到目前位置PS技术的研究主要集中在具有相干检测的单载波光纤传输。 概率整形的基本原理 概率整形技术就是通过在编码前

Explore_OuO的博客 8124

C++之std::declval

std::declval是C++11引入的一个模板函数,将任意类型T转换成右值引用&&类型,在 decltype 表达式中不必经过构造函数就能使用成员函数;通常在模板中使用 std::declval时,模板接受的模板实参通常可能无构造函数,但有同一成员函数,均返回所需类型。

红军不怕远征难,万水千山只等闲 2750

LAMMPS实操系列(一): 大量FCC-CoCrCuFeNi高熵合金建模与最稳定结构筛选

高熵合金(High-entropy alloys,HEA),是由五种或五种以上等量或大约等量金属形成的合金。由于高熵合金可能具有许多优秀的物理化学性质,因此在材料科学领域受到广泛关注

Ceshigo_CD的博客 3257

(C++模板编程):std::declval(上)

目录 基本概念和常规范例 获取类中成员函数返回值类型 std::declval的作用 std::declval为什么返回右值引用类型 基本概念和常规范例 std::declval是c++11新标准中出现的函数模板,没有函数体(只有声明,没有实现),无法被调用, 一般用于与decltype,sizeof等关键字配合来进行类型推导、占用内存空间计算等。 标准库源码 add_rvalue_reference:是C++标准库中的类模板,它的能力是给进来一个类型,他能够返回该类型的右值

baidu_41388533的博客 6019

机械臂视觉抓取避坑指南:如何正确计算手眼标定矩阵(附Numpy代码)

本文详细解析了机械臂视觉抓取中手眼标定矩阵的计算方法,特别针对'眼在手上'配置下的常见错误提供了解决方案。通过Numpy代码示例和坐标转换原理,帮助开发者避免矩阵计算错误和坐标转换偏差,提升工业自动化系统的精度和效率。

weixin_29081703的博客 243

使用 Cadence ams 仿真器 对 混合信号电路 进行仿真

文章目录Cadence 基于ams仿真器的混合信号电路仿真建立数字(Digital)模块建立 Analog - Digital 混合仿真原理图建立 Analog - Digital 混合仿真config文件配置混合信号电路仿真环境针对混合信号电路demo进行仿真 Cadence 基于ams仿真器的混合信号电路仿真 你好,这里是一篇关于使用 Cadence 软件通过 ams 仿真器对混合信号电路(D...

mymatin1004的博客 2万+

declval

标准库的典型内容 介绍C++标准库典型且常用的函数模板、类模板、别名模板等功能组件以及它们的实现细节 std::declval 基本概念和常规实例 std::decval–C++新标准中出现的函数模板,没有函数体(只有声明、没有实现),无法调用,一般用于与decltype,sizeof等关键字配合来进行类型推导、占用内存空间计算等 查看源码 add_rvalue_reference:是C++标准库中的类模板,他的能力是给进一个类型,它能够返回该类型的右值引用类型。 给进一个int类型,

m0_51271123的博客 1719

Jetson Orin NX深度学习环境配置全攻略:从JetPack到PyTorch避坑指南

本文提供Jetson Orin NX深度学习环境配置的完整避坑指南。重点讲解如何正确利用JetPack SDK作为系统基石,使用Miniforge管理Python环境,并安装与CUDA版本严格匹配的PyTorch特供版本。通过详细的步骤和验证方法,帮助开发者在ARM架构的嵌入式平台上高效搭建稳定的AI开发工作站。

yolo5detector的博客 272

c++std::declval函数模板详解

std::declval详解 std::declval认识 概念 std::declval–c++11新标准中出现的函数模板,没有函数体(只有声明,没有实现),无法被调用,一般用于与decltype,sizeof等关键字配合来进行类型推导、占用内存空间计算等。 常规范例 std::declval为什么返回右值引用类型 返回类型本身是不好的 返回右值引用还是左值引用 这一小节通过一些小的范例演示,给出为什么标准库当中的std::declval返回的是右值引用。 调用引用限定符修饰的成员函数示例 推导函数返

qq_38158479的博客 3841

Keras神经网络可视化模块keras.utils.visualize_util的安装配置方法

本文介绍了如何安装和配置keras.utils.visualize_util模块,并提供了一个简单的示例演示如何使用该模块来可视化神经网络的结构。在上述代码中,我们首先定义了一个简单的神经网络模型,该模型具有一个输入层、一个隐藏层和一个输出层,其中隐藏层具有512个神经元,输出层具有10个神经元。运行上述代码后,我们将在当前工作目录下找到一个名为model.png的文件,它显示了神经网络的结构图。这种方式有效地展示了整个过程,让我们能够更好地理解神经网络的结构,方便对其进行改进和调试。

. 890

RK3568 上C图像camera图像采集应用实例(二)

本文探索rk3568上实现C语言的 通过C v4l2 接口 采集图像 ,刷屏控制 drm的显示camera图像中 实现camera preview 预览 的实践和探索。

luoshanxuli2010的专栏 758

【模板进阶】std::declval

std::declvalstd::declvalstd::declval 是C++11C++11C++11标准中出现的一个函数模板。这个函数模板设计的比较奇怪(没有实现,只有声明),因此无法被调用,通常是和decltyedecltyedecltye和sizeofsizeofsizeof等关键字一起使用,来进行类型推导等等。下面是declvaldeclvaldeclval的一般源码实现: 这里的std::add_rvalue_reference_tstd::add\_rvalue\_reference\_ts

Antonio915的博客 1138

ArcGIS:景观指数和景观单元关联生成景观指数遥感图像

优快云@_养乐多_本文将记录,使用由 Fragstats V4.2 软件计算的景观指数和瓦片 tif 数据生成景观指数图像的操作步骤。本教程的操作均在ArcGIS上进行,最后生成一个研究区内指定景观单元大小的景观指数图像。结果如下所示,

养乐多的博客 4927

C++11 std::declval

一 简介 头文件<utility> template<class T> typename std::add_rvalue_reference<T>::type declval() noexcept; (C++11 起) 1. std::declval将T转换为引用类型。 2. 通常在模板中使用std::declval。 3. std::declv...

程序员Link 586

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

c++11:std::declval、decltype

1、decltype是类型推导 #include <iostream> struct A { double x; }; const A* a; decltype(a->x) y; // y 的类型是 double(其声明类型) decltype((a->x)) z = y; // z 的类型是 const double&(左值表达式) template<typename T, typename U> auto add(T t, U u) -

李白 1541

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C++ std::declval <utility> (tcy)

1.1.定义: template<class T> typename std::add_rvalue_reference<T>::type declval() noexcept; (since C++11) 1.2.用途: 将任何类型转为引用类型,从而可用在decltype表达式而无需通过构造函数 1.3.说明: 1)declval通常在模板中使用;模板参数可能没有构造函数,但具有返回类.

tcy-阿春 578

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C++中std::declval使用详解

定义在头文件<utility>换句话说,它是一个模板函数声明(不是定义!),其返回类型是T&&(即T的右值引用)。不能被真正调用,它只是用于编译期推导类型的伪对象生成器。场景写法返回类型可否运行时调用获取成员函数返回类型推导类型❌获取运算符结果类型推导类型❌获取成员指针类型类型✅(静态)获取构造返回类型构造函数返回类型❌。

qq_36812406的博客 561

template系列--decltype与std::declval

引言 最近在重新复读《C++ template》相关知识,因此预计总结相关知识汇成template系列。 目前碰到decltype与std::declval相关知识,为了搞懂decltype和std::declval的搭配使用原理,我参考了如下链接, decltype specifier Why does std::declval add a reference? What are unevaluated operands in C++? C++ Templates(第2版 英文版) 最终总结

qls315的博客 582

c++之std::declval 和 decltype以及std::result_of,invoke_result

https://juejin.cn/post/7021306822350864414std::declval 和 decltype https://www.jianshu.com/p/6606796de366c++11: std::declval/std::decltype #include<utility> #include<iostream> int test(int a,int b){ int c = a+b; std::cout<<"Run Te

weixin_44537992的博客 2068

decltype,std::declval,std::result_of, std::invoke_result

result_of与invoke_result的区别在于使用方式不同。

zhaofuguang的专栏 804

(C++模板编程):std::declval(下)

目录 std::declval 返回左值引用还是返回右值引用 调用引用限定符修饰的成员函数范例 推导函数返回值范例 std::declval 返回左值引用还是返回右值引用 class A { public: A(int i) //构造函数 { printf("A::A()函数执行了,this=%p\n", this); } double myfunc() //普通成员函数 { printf("A::myfunc()函数执行了,this=%p\n", this);

baidu_41388533的博客 779

C++泛型编程学习 std::declval void_t

//判断是否有这种类型 #define _HAS_TYPE_MEM_(parMTpNm)\ template<typename T, typename U = std::void_t<>>\ struct HTM_##parMTpNm: std::salse_type{}; \ template<typename T>\ struct HTM_##parMTpNm<T, std::void_t<typename T::parMTpNm>>:std.

网瘾少年丶的博客 1270

C++ std::declval:编译期类型探测与SFINAE编程的核心工具

在C++模板元编程中,类型萃取和编译期接口检测是构建泛型库和实现SFINAE(Substitution Failure Is Not An Error)的关键技术。其核心原理是通过在编译期对类型进行表达式有效性检查,从而在不实例化对象的情况下推断类型的属性和能力。这一技术为编写高度灵活、类型安全的泛型代码提供了基础,广泛应用于标准库实现、概念检查(Concepts)和编译期多态等场景。具体到工程实践,std::declval作为核心工具,允许在未求值上下文中模拟类型的实例,从而安全地检测成员函数(如seri

weixin_34384557的博客 402

C++11的std::declval与decltype

转载于https://blog.youkuaiyun.com/uVarAndMethod/article/details/108331662 void_t 判断 类型是否存在 class T { public: int test(){int a = 1;} } std::declval:将任何一个类型T转换成引用类型, 在不创建对象的情况下能达到创建对像的效果, 可以使 decltype 表达式中不必经过构造函数就能使用成员函数 eg: decltype(std::declval<T&g

hanxiaoyong_的博客 1319

c++11::std::decltype/declval

decltype ( 实体 ) (1) (C++11 起) decltype ( 表达式 ) (2) (C++11 起) 若实参是其他类型为 T 的任何表达式,且 a) 若 表达式 的值类别为亡值,则 decltype 产生 T&&; b) 若 表达式 的值类别为左值,则 decltype 产生 T&; c) 若 表达式...

dianyun7150的博客 451
上一篇: String 类和 STL (Standard Template Library)
下一篇: C++20 高级编程
Computer_Tech
码龄3年 0粉丝 49原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值