过年之无用知识研究:std::is_assignable到底怎么个事?

下面是gcc的std::is_assignable相关源码:template<typename _Tp, typename _Up>class __is_assignable_helper{template<
typename _Tp1, typename _Up1,typename = decltype(declval<_Tp1>() = declval<_Up1>()) //注意这行
>static true_type__test(int);template<typename, typename>static false_type__test(...);public:typedef decltype(__test<_Tp, _Up>(0)) type;};————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。原文链接:https://blog.csdn.net/10km/article/details/50232141

 其中,

decltype(declval<_Tp1>() = declval<_Up1>())

 的写法有些奇怪。其中declval()是个函数,返回一个右值类型(要折叠):

declval<int>()就是int&&,它是右值,所以没法作为左值而放在等号的左边

using T = decltype(declval<int>() = declval<int>()); //编译不过。提示:error C2106: “=”: 左操作数必须为左值下面输出:int && __ptr64
#include <boost/type_index.hpp>using T = decltype(declval<int>());
std::cout << boost::typeindex::type_id_with_cvr<T>().pretty_name() << std::endl;

declval<int&>()是&&和&进行折叠,结果是int&,所以它可以作为左值放在等号左边

using T = decltype(declval<int&>() = declval<int>()); //编译通过下面输出:int & __ptr64
#include <boost/type_index.hpp>using T = decltype(declval<int&>());
std::cout << boost::typeindex::type_id_with_cvr<T>().pretty_name() << std::endl;

可以看看:无用的知识又增加了:is_assignable means?-CSDN博客

还有个例子可以看看,关于左值类型和右值类型在等号左边的情况:

https://ideone.com/QdRjZB#include <iostream>
#include <type_traits>
using namespace std;template <typename T>
T rvalue() { return T(); }template <typename T>
T& lvalue() { static T t; return t; }int main() {cout << is_assignable<double, int>::value;cout << is_assignable<double, int&>::value;cout << is_assignable<double&, int>::value;cout << is_assignable<double&, int&>::value;rvalue<double>() = rvalue<int>(); // Doesn't compilervalue<double>() = lvalue<int>(); // Doesn't compilelvalue<double>() = rvalue<int>(); // OKlvalue<double>() = lvalue<int>(); // OKreturn 0;
}
int main()
{
//int& = int&&using T = decltype(declval<int&>() = declval<int>()); //编译通过//int&& = int&&using T = decltype(declval<int>() = declval<int>()); //error C2106: “=”: 左操作数必须为左值
}对应:
int main()
{
std::cout << std::boolalpha<< "int is assignable from int? "<< std::is_assignable<int, int>::value << '\n' // 1 = 1; wouldn't compile<< "int& is assignable from int? "<< std::is_assignable<int&, int>::value << '\n'; // int a; a = 1; works
}关于:std::is_assignable<int, int>,貌似可以用下面的例子感受:https://ideone.com/QdRjZB#include <iostream>
#include <type_traits>
using namespace std;template <typename T>
T rvalue() { return T(); }template <typename T>
T& lvalue() { static T t; return t; }int main() {cout << is_assignable<double, int>::value;cout << is_assignable<double, int&>::value;cout << is_assignable<double&, int>::value;cout << is_assignable<double&, int&>::value;rvalue<double>() = rvalue<int>(); // Doesn't compilervalue<double>() = lvalue<int>(); // Doesn't compile//lvalue<double>() = rvalue<int>(); // OK//lvalue<double>() = lvalue<int>(); // OKreturn 0;
}
std::pair<int, int> data0 = std::make_pair(1, 2);std::pair<int, int> data1 = std::make_pair(3, 4);data0 = data1;return 1;源代码:pair& operator=(const volatile pair&) = delete;//走到这个operator= 函数template<class _Other1 = _Ty1,class _Other2 = _Ty2,enable_if_t<conjunction_v<is_assignable<_Ty1&, const _Other1&>,is_assignable<_Ty2&, const _Other2&>>, int> = 0>pair& operator=(const pair<_Other1, _Other2>& _Right)_NOEXCEPT_COND(is_nothrow_assignable_v<_Ty1&, const _Other1&>&& is_nothrow_assignable_v<_Ty2&, const _Other2&>)	// strengthened{first = _Right.first; //second = _Right.second;return (*this);}调试堆栈里,可以看到实例化后的类型
std::pair<int,int>::operator=<int,int,0>(const std::pair<int,int> & _Right={...}) 
也就是说_Ty1是int,_Ty2也是int。
所以is_assignable<_Ty1&, const _Other1&>和is_assignable<_Ty2&, const _Other2&>的结果
肯定都是true展开之后类似于,但这三行编译不过,应该T是int&类型:
using T = decltype(declval<int&>() = declval<const int&>());
T a = 1;
std::ignore = a;但是T的类型,打印出来却是int,可以在stackoverflow搜typeid doesn't return correct type
using T = decltype(declval<int&>() = declval<const int&>());
std::cout << typeid(T).name() << std::endl;cout << typeid(int&).name();打印出的不是int&而是int
std::cout << std::boolalpha<< (typeid(int&) == typeid(int));//执行结果是:true下面这个可以编译成功。
using T = decltype(declval<int&>() = declval<const int&>());
int b = 0;
T a = b;
std::ignore = a;https://stackoverflow.com/questions/5151875/typeid-doesnt-return-correct-type?rq=3
下面可以打印出:
#include <boost/type_index.hpp>//输出int & __ptr64
std::cout << boost::typeindex::type_id_with_cvr<int&>().pretty_name() << std::endl;
//输出int
std::cout << boost::typeindex::type_id<int&>().pretty_name() << std::endl;
return 0;
using T = decltype(declval<int>() = declval<int>());
std::cout << typeid(T).name() << std::endl;编译提示:
error C2106: “=”: 左操作数必须为左值左边的declval<int>()生成一个int&&,右边的declval<int>()生成一个int&&下面输出:int && __ptr64
using T = decltype(declval<int>());
std::cout << boost::typeindex::type_id_with_cvr<T>().pretty_name() << std::endl;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/68429.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单链表算法实战:解锁数据结构核心谜题——链表的回文结构

题目如下&#xff1a; 解题过程如下&#xff1a; 回文结构举例&#xff1a; 回文数字&#xff1a;12521、12321、1221…… 回文字符串&#xff1a;“abcba”、“abba”…… 并不是所有的循环嵌套的时间复杂度都是O(n^2) 可以用C写C程序&#xff1a; C里可以直接使用ListNode…

C++ 包装器与绑定器的应用之回调函数的实现

回调函数的实现 在消息队列和网络库的框架中&#xff0c;当接收到消息&#xff08;报文&#xff09;时&#xff0c;回调用户自定义的函数对象&#xff0c;把消息&#xff08;报文&#xff09;参数传给它&#xff0c;由它决定如何处理。 queue参考文章:C queue(STL queue&…

除了layui.js还有什么比较好的纯JS组件WEB UI?在谷歌浏览上显示

以下是一些比较好的纯JS组件WEB UI&#xff0c;可以在谷歌浏览器上良好显示&#xff1a; 1. Sencha 特点&#xff1a;提供超过140个高性能UI组件&#xff0c;用于构建现代应用程序。支持与Angular和React集成&#xff0c;提供企业级网格解决方案。 适用场景&#xff1a;适用于…

计算机网络 (58)无线局域网WLAN

前言 无线局域网WLAN&#xff08;Wireless Local Area Network&#xff09;是一种利用无线通信技术将计算机设备互联起来&#xff0c;构成可以互相通信和实现资源共享的网络体系。 一、定义与特点 定义&#xff1a; WLAN通过无线信道代替有线传输介质连接两个或多个设备形成一个…

AIP-132 标准方法:List

编号132原文链接AIP-132: Standard methods: List状态批准创建日期2019-01-21更新日期2022-06-02 在许多API中&#xff0c;通常会向集合URI&#xff08;例如 /v1/publishers/1/books &#xff09;发出GET请求&#xff0c;获取集合中资源的列表。 面向资源设计&#xff08;AIP…

Vue.js组件开发-Vue实现上传word模版打印设置自定义样式和布局

要使用 Vue 实现上传 Word 模板、打印并设置自定义样式和布局&#xff0c;可以借助一些工具和库来完成这个任务。 实现步骤 创建 Vue 项目&#xff1a;使用 Vue CLI 创建一个新的 Vue 项目。安装依赖&#xff1a;安装 docx-templates 库来处理 Word 模板&#xff0c;file-sav…

算法随笔_28:最大宽度坡_方法2

上一篇:算法随笔_27:最大宽度坡-CSDN博客 题目描述如下: 给定一个整数数组 nums&#xff0c;坡是元组 (i, j)&#xff0c;其中 i < j 且 nums[i] < nums[j]。这样的坡的宽度为 j - i。 找出 nums 中的坡的最大宽度&#xff0c;如果不存在&#xff0c;返回 0 。 示例 …

C++中函数返回值当引用

文章目录 一、概述二、返回值当引用的基本语法三、返回局部变量的引用四、返回引用的常见用途五、返回右值引用六、总结 一、概述 在 C 中&#xff0c;函数返回值当引用&#xff08;即返回引用&#xff09;是一个常见的编程技巧。它可以让你返回一个函数内部的局部变量或对象的…

10 款《医学数据库和期刊》查阅网站

在毕业设计过程中,需要查阅到关于医学的相关文献和图片作为参考,发现下面10款非常的好用,作为分享。 1. PubMed: PubMed 搜索关键词如“lung cancer CT images”或“lung cancer CT scan”。 Radiopaedia: https://radiopaedia.org/ 这是一个放射学专业网站,有大量肺癌的CT…

OpenCV:形态学梯度

目录 简述 1. 用图像运算和腐蚀实现形态学梯度 1.1 代码示例 1.2 运行结果 2. 形态学梯度接口 2.1 参数解释 2.2 代码示例 2.3 运行结果 3. 形态学梯度与边缘检测 4. 形态学梯度的应用场景 5. 注意事项 相关阅读 OpenCV&#xff1a;图像的腐蚀与膨胀-CSDN博客 简述…

Java 大视界 -- Java 大数据在生物信息学中的应用与挑战(67)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

MySQL中InnoDB逻辑存储结构

在MySQL中&#xff0c;InnoDB是最常用的存储引擎之一&#xff0c;它具有高度的事务支持、行级锁、ACID特性以及自动崩溃恢复等特性。InnoDB的逻辑存储结构可以分为多个层次&#xff0c;下面是详细的解析。 1. 表空间 (Tablespace) InnoDB的物理存储结构以表空间为基础。表空间…

字符设备驱动模版-中断

字符设备驱动模版-中断 思维导图在线高清查看&#xff1a;https://www.helloimg.com/i/2025/01/27/679791b5257c0.png 修改设备树 1添加pinctrl节点 1创建对应的节点 在 iomuxc 节点的 imx6ul-evk 子节点下 2添加“fsl,pins”属性 3在“fsl,pins”属性中添加PIN配置信息 …

【SH】Windows禁用Alt+F4关机、重启、注销等功能,只保留关闭应用的功能

文章目录 组策略编辑器参考文档 组策略编辑器 亲测有效&#xff01; 1、按winr&#xff0c;输入gpedit.msc&#xff0c;回车。 2、找到》用户配置》管理模板》“开始”菜单和任务栏。 3、在右侧找到删除并阻止访问“关机”、“重新启动”、“睡眠”和“休眠”命令&#xff0c…

AndroidCompose Navigation导航精通2-过渡动画与路由切换

目录 前言路由切换NavControllerBackStackEntry过渡动画过渡原理缩放动画渐隐动画滑动动画动画过渡实战前言 在当今的移动应用开发中,导航是用户与应用交互的核心环节。随着 Android Compose 的兴起,它为开发者提供了一种全新的、声明式的方式来构建用户界面,同时也带来了更…

分库分表后如何进行join操作

在分库分表后的系统中&#xff0c;进行表之间的 JOIN 操作比在单一数据库表中复杂得多&#xff0c;因为涉及的数据可能位于不同的物理节点或分片中。此时&#xff0c;传统的 SQL JOIN 语句不能直接用于不同分片的数据&#xff0c;以下是几种处理这样的跨分片 JOIN 操作的方法&a…

【深度学习】线性回归的简洁实现

线性回归的简洁实现 在过去的几年里&#xff0c;出于对深度学习强烈的兴趣&#xff0c;许多公司、学者和业余爱好者开发了各种成熟的开源框架。 这些框架可以自动化基于梯度的学习算法中重复性的工作。 目前&#xff0c;我们只会运用&#xff1a; &#xff08;1&#xff09;通…

C++中的显式构造和隐式构造

文章目录 一、概述二、显式构造函数的使用三、隐式构造函数的使用四、显式和隐式的适用场景 一、概述 在 C 中&#xff0c;构造函数可以分为 显式构造 和 隐式构造&#xff0c;它们的区别主要体现在构造函数的调用方式上。 1.显式构造&#xff08;Explicit Constructor&#…

【YOLOv11改进- 主干网络】YOLOv11+MobileNetV3(2019): 更快,更精准;

YOLOV11目标检测-主干网络改进实例与创新改进专栏 目录 YOLOV11目标检测-主干网络改进实例与创新改进专栏 本文介绍 1.完整代码获取 2.MobileNetv3介绍 文章摘要 3. MobileNetv3网络结构图 4. yolov11-MobileNetv3 yaml文件 5.MobileNetv3代码实现 6.MobileNetv3添加方…

A7. Jenkins Pipeline自动化构建过程,可灵活配置多项目、多模块服务实战

服务容器化构建的环境配置构建前需要解决什么下面我们带着问题分析构建的过程:1. 如何解决jenkins执行环境与shell脚本执行环境不一致问题?2. 构建之前动态修改项目的环境变量3. 在通过容器打包时避免不了会产生比较多的不可用的镜像资源,这些资源要是不及时删除掉时会导致服…