C++标准模板(STL)- 类型支持 (受支持操作,检查类型是否有拥有移动赋值运算符)

news2024/9/23 17:20:22

类型特性


类型特性定义一个编译时基于模板的结构,以查询或修改类型的属性。

试图特化定义于 <type_traits> 头文件的模板导致未定义行为,除了 std::common_type 可依照其所描述特化。

定义于<type_traits>头文件的模板可以用不完整类型实例化,除非另外有指定,尽管通常禁止以不完整类型实例化标准库模板。
 

受支持操作

继承自 std::integral_constant

成员常量

value

[静态]

T 可移动赋值则为 true ,否则为 false
(公开静态成员常量)

成员函数

operator bool

转换对象为 bool ,返回 value
(公开成员函数)

operator()

(C++14)

返回 value
(公开成员函数)

成员类型

类型定义
value_typebool
typestd::integral_constant<bool, value>

检查类型是否有拥有移动赋值运算符

std::is_move_assignable, 
std::is_trivially_move_assignable, 
std::is_nothrow_move_assignable

template< class T >
struct is_move_assignable;

(1)(C++11 起)

template< class T >
struct is_trivially_move_assignable;

(2)(C++11 起)

template< class T >
struct is_nothrow_move_assignable;

(3)(C++11 起)

1) 若 T 不是可引用类型(即可为 cv 限定的 void 或带 cv-qualifier-seqref-qualifier 的函数类型),则提供等于 false 的成员常量 value 。否则,提供等于 std::is_assignable<T&, T&&>::value 的成员常量 value

2) 同 1) ,但使用 std::is_trivially_assignable<T&, T&&>

3) 同 1) ,但使用 std::is_nothrow_assignable<T&, T&&>

T 应为完整类型、(可为 cv 限定的) void ,或未知边界数组。否则行为未定义。

若上述模板的实例化直接或间接地依赖于不完整类型,并且如果假如使该类型完整,实例化就会产生不同的结果,则行为未定义。

辅助变量模板

template< class T >
inline constexpr bool is_move_assignable_v = is_move_assignable<T>::value;

(C++17 起)

template< class T >
inline constexpr bool is_trivially_move_assignable_v = is_trivially_move_assignable<T>::value;

(C++17 起)

template< class T >
inline constexpr bool is_nothrow_move_assignable_v = is_nothrow_move_assignable<T>::value;

(C++17 起)

可能的实现

template< class T>
struct is_move_assignable
    : std::is_assignable< typename std::add_lvalue_reference<T>::type,
                          typename std::add_rvalue_reference<T>::type> {};
 
template< class T>
struct is_trivially_move_assignable
    : std::is_trivially_assignable< typename std::add_lvalue_reference<T>::type,
                                    typename std::add_rvalue_reference<T>::type> {};
 
template< class T>
struct is_nothrow_move_assignable
    : std::is_nothrow_assignable< typename std::add_lvalue_reference<T>::type,
                                  typename std::add_rvalue_reference<T>::type> {};

注意

特性 std::is_move_assignable 不如可移动赋值 (MoveAssignable) 严格,因为它既不检查赋值的结果类型(对于可移动赋值 (MoveAssignable) 类型必须是 T& ),也不检查赋值后目标的值等于赋值前源的值的语义要求。

为满足此特性,类型不必实现移动赋值运算符,细节见可移动赋值 (MoveAssignable) 。

调用示例

#include <iostream>
#include <string>
#include <type_traits>
struct Foo
{
    int n;
};
struct NoMove
{
    // 避免默认的移动赋值运算符的隐式定义
    // 然而,该类仍然可移动赋值,因为
    // 其复制赋值运算符能绑定到右值参数
    NoMove& operator=(const NoMove&)
    {
        return *this;
    }
};
int main()
{
    std::cout << std::boolalpha;
    std::cout << "std::string is move-assignable? "
              << std::is_move_assignable<std::string>::value << std::endl;
    std::cout << "std::string is nothrow move-assignable? "
              << std::is_nothrow_move_assignable<std::string>::value << std::endl;
    std::cout << "std::string is trivially move-assignable? "
              << std::is_trivially_move_assignable<std::string>::value << std::endl;

    std::cout << "int[2] is move-assignable? "
              << std::is_move_assignable<int[2]>::value << std::endl;
    std::cout << "int[2] is nothrow move-assignable? "
              << std::is_nothrow_move_assignable<int[2]>::value << std::endl;
    std::cout << "int[2] is trivially move-assignable? "
              << std::is_trivially_move_assignable<int[2]>::value << std::endl;

    std::cout << "Foo is move-assignable? "
              << std::is_move_assignable<Foo>::value << std::endl;
    std::cout << "Foo is nothrow move-assignable? "
              << std::is_nothrow_move_assignable<Foo>::value << std::endl;
    std::cout << "Foo is trivially move-assignable? "
              << std::is_trivially_move_assignable<Foo>::value << std::endl;

    std::cout << std::boolalpha
              << "NoMove is move-assignable? "
              << std::is_move_assignable<NoMove>::value << std::endl;
    std::cout << "NoMove is nothrow move-assignable? "
              << std::is_nothrow_move_assignable<NoMove>::value << std::endl;
    std::cout << "NoMove is trivially move-assignable? "
              << std::is_trivially_move_assignable<NoMove>::value << std::endl;

    return 0;
}

输出

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

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

相关文章

Linux-AWK(应用最广泛的文本处理程序)

目录 一、awk基础 二、awk工作原理 三、OFS输出分隔符 四、awk的格式化输出 五、awk模式pattern 一、awk基础 使用案例&#xff1a; 1.准备工作 请在Linux中执行以下指令 cat -n /etc/passwd > ./passwd 练习&#xff1a; 1.从文件 passwd 中提取并打印出第五行的内…

初学者向导:Sketch设计软件自学教程大全

Sketch软件是Mac平台上流行的矢量图形编辑软件&#xff0c;旨在帮助用户创建各种设计原型&#xff0c;如网站、移动应用程序、图标等。Sketch软件的设计风格简单明了&#xff0c;界面操作简单易用&#xff0c;非常适合UI/UX设计师、平面设计师等数字创意人员。本文作为软件自学…

C语言—数组入门

数组定义方式 int一个占4个字节&#xff0c;char一个占1个字节&#xff0c;double一个占8个字节&#xff0c;所以三个最后都是24. 数组不能被动态定义 下面代码是不可行的&#xff01;&#xff01;&#xff01;访问数组中元素 下标索引从0开始 如果定义数组int a[10]&#…

2.7 CE修改器:多级指针查找

在本步骤中&#xff0c;你需要使用多级指针的概念来查找健康值真正的地址并修改它。多级指针就是一个指针的指针&#xff0c;也就是第一个指针指向第二个指针&#xff0c;第二个指针指向第三个指针&#xff0c;以此类推&#xff0c;最终指向你想要访问的地址。 首先&#xff0…

leetcode:876. 链表的中间结点

一、题目 函数原型&#xff1a; struct ListNode* middleNode(struct ListNode* head) 二、思路 要找到链表的中间结点&#xff0c;有两种思路&#xff1a; 暴力解法&#xff1a;先遍历一遍链表&#xff0c;计算出链表的长度&#xff0c;再次遍历链表&#xff0c;找到中间结点。…

马达加斯加市场开发攻略,收藏一篇就够了

马达加斯加是位于非洲南部一个国家&#xff0c;虽然经济是比较落后的一个国家&#xff0c;但是一直以来跟中国的关系都还不错&#xff0c;生产生活资料也是比较依赖进口的&#xff0c;市场潜力还是不错的。今天就来给大家分享一下马达加斯加的相关攻略。大家点赞收藏关注慢慢看…

北大联合智源提出训练框架LLaMA-Rider

大语言模型因其强大而通用的语言生成、理解能力&#xff0c;展现出了成为通用智能体的潜力。与此同时&#xff0c;在开放式的环境中探索、学习则是通用智能体的重要能力之一。因此&#xff0c;大语言模型如何适配开放世界是一个重要的研究问题。 北京大学和北京智源人工智能研究…

Django中Cookie和Session的使用

目录 一、Cookie的使用 1、什么是Cookie&#xff1f; 2、Cookie的优点 3、Cookie的缺点 4、Django中Cookie的使用 二、Session的使用 1、什么是Session&#xff1f; 2、Session的优点 3、Session的缺点 4、Django中Session的使用 三、Cookie和Session的对比 总结 D…

低功耗蓝牙技术 > GAP和GATT介绍

GAP&#xff08;Generic Access Profile&#xff09;和GATT&#xff08;Generic Attribute Profile&#xff09;简介 在蓝牙技术的发展中&#xff0c;GAP和GATT两个协议扮演着关键的角色&#xff0c;为BLE&#xff08;低功耗蓝牙&#xff09;设备之间的通信提供了规范和框架。…

拼多多API接口,打造智能化电商平台

近年来&#xff0c;电商行业的崛起给人们的购物带来了极大的方便。随着电商行业的发展&#xff0c;拼多多作为新兴电商平台已经成为市场焦点。 同时&#xff0c;随着技术的发展&#xff0c;API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&…

振动异响振动案例 | 本田思域怠速时发动机异响

虽然未来可能是“电动”的&#xff0c;但内燃机&#xff08;ICE&#xff09;在永远消失之前还有很多年。但是&#xff0c;我确信它永远不会。从目前的立法来看&#xff0c;到2030年&#xff0c;传统的汽油和柴油汽车/货车将被禁止销售&#xff0c;插电式混合动力车将延长到2035…

java--String使用时的注意事项

1.String使用时的注意事项 第一点&#xff1a; ①String对象的内容不可改变&#xff0c;被称为不可变字符串对象。(因为字符串是引用类型&#xff0c;每次都是引用一个地址&#xff0c;就相当于你有车&#xff0c;但是你不可能天天把车踹兜里&#xff0c;只能把钥匙踹兜里&am…

「得力集团」启动采购供应链协同项目,携手企企通打造文创科技产业行业标杆

近期&#xff0c;国内最大的办公与学习用品产业集团、多工作场景整体解决方案的领导者「得力集团有限公司」与企企通成功签约&#xff0c;并顺利召开采购供应链协同项目启动会。 本次会议中&#xff0c;双方高层领导与项目团队成员就项目的功能需求、实施方案、资源支持等问题进…

Direct3D拾取

假设在屏幕上单击&#xff0c;击中的位置为点s(x,y)。由图可以看出&#xff0c;用户选中了茶壶。但是仅给出点s&#xff0c;应用程序还无法立即判断出茶壶是否被选中。所以针对这类问题&#xff0c;我们需要采用一项称为“拾 取(Picking)”的技术。 茶壶和屏幕点s之间的一种联…

谷歌竞价排名10个引爆利器揭秘分享-华媒舍

谷歌是目前世界上最受欢迎的搜索引擎之一&#xff0c;而竞价排名则是企业在谷歌平台上提升在线曝光度的重要手段。本文将介绍10个能够帮助企业轻松提高谷歌竞价排名的利器&#xff0c;让您的产品或服务脱颖而出。 第一利器&#xff1a;关键词优化 关键词优化是提升竞价排名的基…

Accelerate 0.24.0文档 一:两万字极速入门

文章目录 一、概述1.1 PyTorch DDP1.2 Accelerate 分布式训练简介1.2.1 实例化Accelerator类1.2.2 将所有训练相关 PyTorch 对象传递给 prepare()方法1.2.3 启用 accelerator.backward(loss) 1.3 Accelerate 分布式评估1.4 accelerate launch1.4.1 使用accelerate launch启动训…

垃圾/垃圾桶识别相关开源数据集汇总

垃圾箱图片数据集 数据集下载链接&#xff1a;http://suo.nz/3cvbiC 垃圾箱多类检测数据集 数据集下载链接&#xff1a;http://suo.nz/2eluH3 蒙得维亚的垃圾箱图片 数据集下载链接&#xff1a;http://suo.nz/2lRHLK 垃圾桶满溢检测数据集 数据集下载链接&#xff1a;http:…

PostgreSQL 入门教程

PostgreSQL 入门教程 1. 历史背景2. 概念3. 特点4. 用法4.1 数据库连接4.2 数据库创建4.3 表创建4.4 数据插入4.5 数据查询4.6 数据更新4.7 数据删除 5. 安装步骤6. 简单示例7. 扩展7.1 数据类型7.2 查询优化7.3 并发控制7.4 数据备份和恢复7.5 扩展性和高可用性7.6 安全性加固…

MATLAB中ginput函数用法

目录 语法 说明 示例 标识点和绘制坐标 返回用于选择坐标的按键 标识地理坐标区上的点 ginput函数的功能是标识坐标区坐标。 语法 [x,y] ginput(n) [x,y] ginput [x,y,button] ginput(___) 说明 [x,y] ginput(n) 可用于标识笛卡尔坐标区、极坐标区或地理坐标区内…