C++标准模板(STL)- 概念库 (C++20) - 指定能复制构造和移动构造一个类型的对象 - (std::copy_constructible)

概念库提供基础语言概念的定义,它们能用于进行模板实参的编译时校验,以及基于类型属性的函数派发。这些概念在程序中提供等式推理的基础。

标准库中的大多数概念一同加上了语法及语义要求。通常,编译器只能检查语法要求。若在使用点语义要求未得到满足,则程序为病式,不要求诊断。

类型支持(基本类型、RTTI、类型特性)

指定能复制构造和移动构造一个类型的对象

std::copy_constructible

定义于头文件 <concepts>

template <class T>

concept copy_constructible =
  std::move_constructible<T> &&
  std::constructible_from<T, T&> && std::convertible_to<T&, T> &&
  std::constructible_from<T, const T&> && std::convertible_to<const T&, T> &&

  std::constructible_from<T, const T> && std::convertible_to<const T, T>;
(C++20 起)

概念 copy_constructible 若符合这些条件则得到满足: T 为左值引用类型,或若它是 move_constructible 对象类型,而能从(可为 const 的)该类型左值或 const 右值,在直接和复制初始化语境中以通常语义构造该类型对象(构造副本而不更改源)。

更精确而言,若 T 为对象类型,则 copy_constructible<T> 仅若符合下列条件才得到满足。给定

  • vT 类型左值(可为 const )或为 const T 类型右值,

下列为真:

  • 定义 T u = v; 后, u 等于 v
  • T(v) 等于 v

参阅

is_copy_constructible

is_trivially_copy_constructible

is_nothrow_copy_constructible

(C++11)

检查类型是否拥有复制构造函数
(类模板)

调用示例

#include <iostream>
#include <type_traits>class E
{
public:template<class T> E(T&&) { }
};class A {};
class B : public A {};
class C {};
class D
{
public:operator C(){return c;}  C c;
};//自定义的实现
namespace std
{template< class T, class... Args >
const bool is_constructible_v = is_constructible<T, Args...>::value;template< class T, class... Args >
const bool is_trivially_constructible_v = is_trivially_constructible<T, Args...>::value;template< class T, class... Args >
const bool is_nothrow_constructible_v = is_nothrow_constructible<T, Args...>::value;template< class T >
const bool is_nothrow_destructible_v = is_nothrow_destructible<T>::value;template < class T >
const bool destructible = is_nothrow_destructible<T>::value;template <class From, class To>
constexpr bool convertible_to = (std::is_convertible<From, To>::value);template < class T, class... Args >
const bool constructible_from = (destructible<T> && is_constructible_v<T, Args...>);template< class T >
const bool move_constructible = (constructible_from<T, T> && convertible_to<T, T>);template <class T>
const bool copy_constructible =move_constructible<T> &&constructible_from<T, T&> && convertible_to<T&, T> &&constructible_from<T, const T&> && convertible_to<const T&, T> &&constructible_from<T, const T> && convertible_to<const T, T>;
}
int main()
{std::cout << std::boolalpha;std::cout << "std::is_convertible<B*, A*>::value:           "<< std::is_convertible<B*, A*>::value << std::endl;std::cout << "std::is_convertible<A*, B*>::value:           "<< std::is_convertible<A*, B*>::value << std::endl;std::cout << "std::is_convertible<B*, C*>::value:           "<< std::is_convertible<B*, C*>::value << std::endl;std::cout << "std::is_convertible<D, C>::value:             "<< std::is_convertible<D, C>::value << std::endl;std::cout << "std::is_convertible<E, A>::value:             "<< std::is_convertible<E, A>::value << std::endl;std::cout << "std::is_convertible<int, double>::value:      "<< std::is_convertible<int, double>::value << std::endl;std::cout << "std::is_convertible<int, char>::value:        "<< std::is_convertible<int, char>::value << std::endl;std::cout << "std::is_convertible<std::string, char>::value:"<< std::is_convertible<std::string, char>::value << std::endl;std::cout << "-----------------------------------------------" << std::endl;std::cout << std::endl;std::cout << "std::destructible<A>:                         "<< std::destructible<A> << std::endl;std::cout << "std::destructible<B>:                         "<< std::destructible<B> << std::endl;std::cout << "std::destructible<C>:                         "<< std::destructible<C> << std::endl;std::cout << "std::destructible<D>:                         "<< std::destructible<D> << std::endl;std::cout << "std::destructible<E>:                         "<< std::destructible<E> << std::endl;std::cout << "std::destructible<float>:                     "<< std::destructible<float> << std::endl;std::cout << "std::destructible<int>:                       "<< std::destructible<int> << std::endl;std::cout << "std::destructible<bool>:                      "<< std::destructible<bool> << std::endl;std::cout << std::endl;std::cout << "-----------------------------------------------" << std::endl;std::cout << std::endl;std::cout << "std::constructible_from<B, A>:                "<< std::constructible_from<B, A> << std::endl;std::cout << "std::constructible_from<A, B>:                "<< std::constructible_from<A, B> << std::endl;std::cout << "std::constructible_from<B*, A*>:              "<< std::constructible_from<B*, A*> << std::endl;std::cout << "std::constructible_from<A*, B*>:              "<< std::constructible_from<A*, B*> << std::endl;std::cout << "std::constructible_from<B*, C*>:              "<< std::constructible_from<B*, C*> << std::endl;std::cout << "std::constructible_from<D, C>:                "<< std::constructible_from<D, C> << std::endl;std::cout << "std::constructible_from<E, A>:                "<< std::constructible_from<E, A> << std::endl;std::cout << "std::constructible_from<int, double>:         "<< std::constructible_from<int, double> << std::endl;std::cout << "std::constructible_from<int, char>:           "<< std::constructible_from<int, char> << std::endl;std::cout << "std::constructible_from<std::string, char>:   "<< std::constructible_from<std::string, char> << std::endl;std::cout << "-----------------------------------------------" << std::endl;std::cout << std::endl;std::cout << "std::convertible_to<B, A>:                    "<< std::convertible_to<B, A> << std::endl;std::cout << "std::convertible_to<A, B>:                    "<< std::convertible_to<A, B> << std::endl;std::cout << "std::convertible_to<B*, A*>:                  "<< std::convertible_to<B*, A*> << std::endl;std::cout << "std::convertible_to<A*, B*>:                  "<< std::convertible_to<A*, B*> << std::endl;std::cout << "std::convertible_to<B*, C*>:                  "<< std::convertible_to<B*, C*> << std::endl;std::cout << "std::convertible_to<D, C>:                    "<< std::convertible_to<D, C> << std::endl;std::cout << "std::convertible_to<E, A>:                    "<< std::convertible_to<E, A> << std::endl;std::cout << "std::convertible_to<int, double>:             "<< std::convertible_to<int, double> << std::endl;std::cout << "std::convertible_to<int, char>:               "<< std::convertible_to<int, char> << std::endl;std::cout << "std::convertible_to<std::string, char>:       "<< std::convertible_to<std::string, char> << std::endl;std::cout << "-----------------------------------------------" << std::endl;std::cout << std::endl;std::cout << "std::move_constructible<B>:                   "<< std::move_constructible<B> << std::endl;std::cout << "std::move_constructible<A>:                   "<< std::move_constructible<A> << std::endl;std::cout << "std::move_constructible<B*>:                  "<< std::move_constructible<B*> << std::endl;std::cout << "std::move_constructible<A*>:                  "<< std::move_constructible<A*> << std::endl;std::cout << "std::move_constructible<C*>:                  "<< std::move_constructible<C*> << std::endl;std::cout << "std::move_constructible<D>:                   "<< std::move_constructible<D> << std::endl;std::cout << "std::move_constructible<E>:                   "<< std::move_constructible<E> << std::endl;std::cout << "std::move_constructible<int>:                 "<< std::move_constructible<int> << std::endl;std::cout << "std::move_constructible<char>:                "<< std::move_constructible<char> << std::endl;std::cout << "std::move_constructible<std::string>:         "<< std::move_constructible<std::string> << std::endl;std::cout << "-----------------------------------------------" << std::endl;std::cout << std::endl;std::cout << "std::copy_constructible<B>:                   "<< std::copy_constructible<B> << std::endl;std::cout << "std::copy_constructible<A>:                   "<< std::copy_constructible<A> << std::endl;std::cout << "std::copy_constructible<B*>:                  "<< std::copy_constructible<B*> << std::endl;std::cout << "std::copy_constructible<A*>:                  "<< std::copy_constructible<A*> << std::endl;std::cout << "std::copy_constructible<C*>:                  "<< std::copy_constructible<C*> << std::endl;std::cout << "std::copy_constructible<D>:                   "<< std::copy_constructible<D> << std::endl;std::cout << "std::copy_constructible<E>:                   "<< std::copy_constructible<E> << std::endl;std::cout << "std::copy_constructible<int>:                 "<< std::copy_constructible<int> << std::endl;std::cout << "std::copy_constructible<char>:                "<< std::copy_constructible<char> << std::endl;std::cout << "std::copy_constructible<std::string>:         "<< std::copy_constructible<std::string> << std::endl;return 0;
}

输出

std::is_convertible<B*, A*>::value:           true
std::is_convertible<A*, B*>::value:           false
std::is_convertible<B*, C*>::value:           false
std::is_convertible<D, C>::value:             true
std::is_convertible<E, A>::value:             false
std::is_convertible<int, double>::value:      true
std::is_convertible<int, char>::value:        true
std::is_convertible<std::string, char>::value:false
-----------------------------------------------std::destructible<A>:                         true
std::destructible<B>:                         true
std::destructible<C>:                         true
std::destructible<D>:                         true
std::destructible<E>:                         true
std::destructible<float>:                     true
std::destructible<int>:                       true
std::destructible<bool>:                      true-----------------------------------------------std::constructible_from<B, A>:                false
std::constructible_from<A, B>:                true
std::constructible_from<B*, A*>:              false
std::constructible_from<A*, B*>:              true
std::constructible_from<B*, C*>:              false
std::constructible_from<D, C>:                false
std::constructible_from<E, A>:                true
std::constructible_from<int, double>:         true
std::constructible_from<int, char>:           true
std::constructible_from<std::string, char>:   false
-----------------------------------------------std::convertible_to<B, A>:                    true
std::convertible_to<A, B>:                    false
std::convertible_to<B*, A*>:                  true
std::convertible_to<A*, B*>:                  false
std::convertible_to<B*, C*>:                  false
std::convertible_to<D, C>:                    true
std::convertible_to<E, A>:                    false
std::convertible_to<int, double>:             true
std::convertible_to<int, char>:               true
std::convertible_to<std::string, char>:       false
-----------------------------------------------std::move_constructible<B>:                   true
std::move_constructible<A>:                   true
std::move_constructible<B*>:                  true
std::move_constructible<A*>:                  true
std::move_constructible<C*>:                  true
std::move_constructible<D>:                   true
std::move_constructible<E>:                   true
std::move_constructible<int>:                 true
std::move_constructible<char>:                true
std::move_constructible<std::string>:         true
-----------------------------------------------std::copy_constructible<B>:                   true
std::copy_constructible<A>:                   true
std::copy_constructible<B*>:                  true
std::copy_constructible<A*>:                  true
std::copy_constructible<C*>:                  true
std::copy_constructible<D>:                   true
std::copy_constructible<E>:                   true
std::copy_constructible<int>:                 true
std::copy_constructible<char>:                true
std::copy_constructible<std::string>:         true

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

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

相关文章

Oracle系统表空间的加解密

实验环境 数据库选择的是orclpdb1&#xff0c;当前系统表空间未加密&#xff1a; SQL> show con_nameCON_NAME ------------------------------ ORCLPDB1SQL> select TABLESPACE_NAME, STATUS, ENCRYPTED from dba_tablespaces;TABLESPACE_NAME STATUS …

LeetCode Hot100 搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。…

栈和队列的相关练习

用队列实现栈 首先引用上一篇博客中的队列的相关操作 typedef int QDatatype; typedef struct QueueNode {QDatatype data;struct QueueNode* next; }QueueNode;typedef struct Queue {QueueNode* head;QueueNode* tail;int size; }Queue;void QueueInit(Queue* pq) {assert(p…

《Java初阶数据结构》----3.<线性表---LinkedList与链表>

目录 前言 一、链表的简介 1.1链表的概念 1.2链表的八种结构 重点掌握两种 1.3单链表的常见方法 三、单链表的模拟实现 四、LinkedList的模拟实现&#xff08;双链表&#xff09; 4.1 什么是LinkedList 4.2LinkedList的使用 五、ArrayList和LinkedList的区别 前言 …

机器学习(五) -- 无监督学习(1) --聚类1

系列文章目录及链接 上篇&#xff1a;机器学习&#xff08;五&#xff09; -- 监督学习&#xff08;7&#xff09; --SVM2 下篇&#xff1a;机器学习&#xff08;五&#xff09; -- 无监督学习&#xff08;1&#xff09; --聚类2 前言 tips&#xff1a;标题前有“***”的内容…

Python 教程(四):Python运算符合集

目录 专栏列表前言1. 算术运算符2. 比较运算符3. 逻辑运算符4. 位运算符5. 赋值运算符6. 成员运算符7. 身份运算符总结 在前三篇教程中&#xff0c;我们学习了 Python 的基本语法和数据结构以及字符串的特性。本篇教程&#xff0c;我们将深入探讨 Python 中的运算符合集。 专栏…

transformers进行学习率调整lr_scheduler(warmup)

一、get_scheduler实现warmup 1、warmup基本思想 Warmup&#xff08;预热&#xff09;是深度学习训练中的一种技巧&#xff0c;旨在逐步增加学习率以稳定训练过程&#xff0c;特别是在训练的早期阶段。它主要用于防止在训练初期因学习率过大导致的模型参数剧烈波动或不稳定。…

搜维尔科技:Patchwork 3D-提高汽车设计的效率和创造力

提高汽车设计的效率和创造力 我们很高兴地宣布推出专为雷诺3DCommerce设计的突破性Blender插件。这款创新工具简化了将车辆配置从Patchwork 3D直接导入领先的免费 3D 建模软件Blender的过程。这款插件彰显了我们致力于提供定制解决方案以满足业务需求的承诺。 主要优点&#x…

使用图数据库Nebula Graph快速上手史上最大规模的中文知识图谱ownthink_v2教程(没写完,明天再写)

一、前言 本教程主要参考官方教程&#xff1a;使用图数据库 Nebula Graph 数据导入快速体验知识图谱 OwnThink (nebula-graph.com.cn) 来带着大家一步一步复现实验内容。 本教程主要使用到的数据集&#xff1a; ownthink/KnowledgeGraphData: 史上最大规模1.4亿中文知识图谱…

photoshop学习笔记——选区3 快速选择工具

快速选择工具 W shift W 在3种快速选择工具之间切换 对象选择工具 photoshop CC中没有这个工具&#xff0c;利用AI&#xff0c;将款选中的对象快速的提取选区&#xff0c;测试了一下&#xff0c;选区制作的非常nice快速选择工具 跟磁性套索类似&#xff0c;自动识别颜色相似…

ClkLog:开源用户行为分析框架,让数据分析更轻松

ClkLog&#xff1a;开源用户行为分析框架&#xff0c;让数据分析更轻松 在数据驱动的时代&#xff0c;找到一个好用的用户行为分析工具真是难上加难。但是今天你有福了&#xff0c;开源免费的 ClkLog 就是你的不二选择&#xff01;本文将为你详细介绍 ClkLog 的功能特点、技术架…

Spark RPC框架详解

文章目录 前言Spark RPC模型概述RpcEndpointRpcEndpointRefRpcEnv 基于Netty的RPC实现NettyRpcEndpointRefNettyRpcEnv消息的发送消息的接收RpcEndpointRef的构造方式直接通过RpcEndpoint构造RpcEndpointRef通过消息发送RpcEndpointRef Endpoint的注册Dispatcher消息的投递消息…

聚焦民生服务 助力企业发展 区块链应用加速落地

聚焦民生服务&#xff0c;助力企业发展&#xff0c;区块链应用正在加速落地。这一趋势体现了区块链技术在多个领域的广泛应用和深远影响。以下是对这一主题的详细分析&#xff1a; 一、区块链在民生服务中的应用 政务服务 数据共享与打通&#xff1a;区块链技术利用其分布式账…

Python酷库之旅-第三方库Pandas(048)

目录 一、用法精讲 171、pandas.Series.nlargest方法 171-1、语法 171-2、参数 171-3、功能 171-4、返回值 171-5、说明 171-6、用法 171-6-1、数据准备 171-6-2、代码示例 171-6-3、结果输出 172、pandas.Series.nsmallest方法 172-1、语法 172-2、参数 172-3、…

自动化测试 - selenium 环境搭建

在进行自动化测试时&#xff0c;Selenium 是一个非常强大的工具&#xff0c;在使用前需要做一些环境准备。 1. 配置 Chromedriver 访问 Chrome 浏览器的官方网站&#xff08;https://www.google.cn/chrome/&#xff09;&#xff0c;下载并安装 Chrome 浏览器。 接下来&#x…

html必知必会-html内嵌JavaScript和文件路径

文章目录 HTML JavaScriptHTML <script> 标签JavaScript 的简单示例HTML <noscript> 标签HTML 文件路径绝对文件路径相对文件路径总结 HTML JavaScript JavaScript 使 HTML 页面更具动态性和交互性。 示例 <!DOCTYPE html> <html> <body><…

自训练和增量训练word2vec模型

1、自己准备训练语料文件 根据自己的业务场景准备训练数据&#xff0c;比如用户在商城上的同购行为序列或同浏览行为序列。 我们希望通过自己训练业务相关的语料word2vec模型来获得词嵌入、词相关性查询等。 1.1 准备语料库文件 # 示例&#xff1a;准备自己的一个大规模的语…

RDMA通信4:MR(Memory Region, 内存区域)基本概念和作用

MR简介 RDMA通信中MR(Memory Region)指的是由RDMA软件层在内存中规划出的一片区域&#xff0c;用于存放收发的数据。IB协议中&#xff0c;用户在申请完用于存放数据的内存区域之后&#xff0c;都需要通过调用IB框架提供的API注册MR&#xff0c;才能让RDMA网卡访问这片内存区域…

2.1、matlab绘图汇总(图例、标题、坐标轴、线条格式、颜色和散点格式设置)

1、前言 在 MATLAB 中进行绘图是一种非常常见且实用的操作&#xff0c;可以用来可视化数据、结果展示、分析趋势等。通过 MATLAB 的绘图功能&#xff0c;用户可以创建各种类型的图形&#xff0c;包括线图、散点图、柱状图、曲线图等&#xff0c;以及三维图形、动画等复杂的可视…

数据中台 | 3分钟带你读懂数据中台的由来

1.数据中台产生的原因 数据中台的概念起源于中国阿里巴巴集团提出的“大中台&#xff0c;小前台”战略。这一理念的核心在于通过构建强大的中台体系&#xff0c;为前端的快速创新和个性化业务需求提供强有力的支持。具体到数据中台&#xff0c;其设计初衷是为了应对企业内部数…