当前位置: 首页 > news >正文

C++ 具名要求-基本概念-指定该类型对象可以默认构造

指定该类型对象可以默认构造

要求

以下情况下,类型 T 满足可默认构造 (DefaultConstructible)

给定

  • 任意标识符 u

下列表达式必须合法且拥有其指定的效果

表达式后条件
T u对象 u 被默认初始化。
T u{}对象 u 被值初始化或聚合初始化。
T()

T{}

一个 T 类型的临时对象被值初始化或聚合初始化。

注解

对于非聚合类类型的对象,必须定义公开的默认构造函数(用户定义或隐式定义),以满足可默认构造 (DefaultConstructible)

非类对象类型的非 const 对象始终可默认构造 (DefaultConstructible)

const 的非类类型并非可默认构造 (DefaultConstructible)

const 的聚合类型,若其任何成员是非类类型对象,则并非可默认构造 (DefaultConstructible)

非对象类型(函数类型,引用类型,以及(可能 cv 限定的)void 类型)和 const 的非对象类型始终并非可默认构造 (DefaultConstructible)

调用示例

#include <iostream>
#include <type_traits>//编译器生成默认构造函数
struct A
{
};struct B
{std::string str; // 成员拥有非平凡默认构造函数
};struct C
{std::string str; // 成员拥有非平凡默认构造函数C() throw (int) //构造函数抛异常{}
};struct MyClass
{int ma;int mb;MyClass(): ma(101), mb(102){std::cout << this << "  " << __FUNCTION__ << " " << __LINE__<< " a:" << ma << " b:" << mb<< std::endl;}MyClass(int a, int b): ma(a), mb(b){std::cout << this << "  " << __FUNCTION__ << " " << __LINE__<< " a:" << ma << " b:" << mb<< std::endl;}MyClass(const MyClass &obj){this->ma = obj.ma;this->mb = obj.mb;std::cout << this << "  " << __FUNCTION__ << " " << __LINE__<< " a:" << ma << " b:" << mb<< std::endl;}MyClass(MyClass &&obj){this->ma = obj.ma;this->mb = obj.mb;std::cout << this << "  " << __FUNCTION__ << " " << __LINE__<< " a:" << ma << " b:" << mb<< std::endl;}
};int main()
{std::cout << std::boolalpha;std::cout << "std::is_default_constructible<int>::value: "<< std::is_default_constructible<int>::value << std::endl;std::cout << "std::is_trivially_default_constructible<int>::value: "<< std::is_trivially_default_constructible<int>::value << std::endl;std::cout << "std::is_nothrow_default_constructible<int>::value: "<< std::is_nothrow_default_constructible<int>::value << std::endl;std::cout << std::endl;std::cout << "std::is_default_constructible<A>::value: "<< std::is_default_constructible<A>::value << std::endl;std::cout << "std::is_trivially_default_constructible<A>::value: "<< std::is_trivially_default_constructible<A>::value << std::endl;std::cout << "std::is_nothrow_default_constructible<A>::value: "<< std::is_nothrow_default_constructible<A>::value << std::endl;std::cout << std::endl;std::cout << "std::is_default_constructible<B>::value: "<< std::is_default_constructible<B>::value << std::endl;std::cout << "std::is_trivially_default_constructible<B>::value: "<< std::is_trivially_default_constructible<B>::value << std::endl;std::cout << "std::is_nothrow_default_constructible<B>::value: "<< std::is_nothrow_default_constructible<B>::value << std::endl;std::cout << std::endl;std::cout << "std::is_default_constructible<C>::value: "<< std::is_default_constructible<C>::value << std::endl;std::cout << "std::is_trivially_default_constructible<C>::value: "<< std::is_trivially_default_constructible<C>::value << std::endl;std::cout << "std::is_nothrow_default_constructible<C>::value: "<< std::is_nothrow_default_constructible<C>::value << std::endl;std::cout << std::endl;//T u 对象 u 被默认初始化。MyClass myClass1;//T u{} 对象 u 被值初始化或聚合初始化。MyClass myClass2{201, 202};//T() T{}一个 T 类型的临时对象被值初始化或聚合初始化。MyClass(803, 801);MyClass{303, 301};return 0;
}

输出

std::is_default_constructible<int>::value: true
std::is_trivially_default_constructible<int>::value: true
std::is_nothrow_default_constructible<int>::value: truestd::is_default_constructible<A>::value: true
std::is_trivially_default_constructible<A>::value: true
std::is_nothrow_default_constructible<A>::value: truestd::is_default_constructible<B>::value: true
std::is_trivially_default_constructible<B>::value: false
std::is_nothrow_default_constructible<B>::value: truestd::is_default_constructible<C>::value: true
std::is_trivially_default_constructible<C>::value: false
std::is_nothrow_default_constructible<C>::value: false0x61fe78  MyClass 28 a:101 b:102
0x61fe70  MyClass 35 a:201 b:202
0x61fe80  MyClass 35 a:803 b:801
0x61fe88  MyClass 35 a:303 b:301

http://www.lryc.cn/news/273071.html

相关文章:

  • T527 Android13遥控适配
  • 第三部分使用脚手架:vue学习(61-65)
  • 【Linux学习笔记】解析Linux系统内核:架构、功能、工作原理和发展趋势
  • springboot连接oracle报错ORA-12505解决方案
  • 服务器为什么大多用 Linux?
  • C++上位软件通过Snap7开源库访问西门子S7-200/合信M226ES数据块的方法
  • 通信及信号处理领域期刊影响因子、分区及期刊推荐-2024版
  • cfa一级考生复习经验分享系列(十五)
  • 如潮好评!优秀选手视角下的第二届粤港澳大湾区(黄埔)国际算法算例大赛
  • 软件测试之冒烟测试
  • NE555学习笔记-2024
  • 记一次docker中安装redis的过程
  • Matlab进阶绘图第37期—多色悬浮柱状图
  • 【嵌入式】About USB Powering
  • MySQL——事物
  • Windows搭建RTSP视频流服务(EasyDarWin服务器版)
  • 私域营销,让你的生意从线下到线上都火爆!
  • MATLAB基本绘图操作(二维和三维绘图)
  • 中国社科院与新加坡新跃社科联合培养博士—攻读在职博士的理由是什么?
  • T40N 君正智能处理器T40 BGA 芯片
  • Profinet转Modbus使设备互联更简单
  • Android 文字垂直排列,文字向右旋转90度
  • 域名授权验证系统PHP源码,盗版追踪、双重授权和在线加密功能,附带安装教程
  • Qt线程封装FFmpeg播放器类
  • git 常用命令 修改 远程仓库 默认分支
  • springboot项目禁用dataSource数据源功能,只需修改yml文件,关闭数据库连接功能
  • 【Vue.js设计与实现解读-1】
  • 苗情生态自动监测系统-科普知识
  • test 系统学习-04-test converate 测试覆盖率 jacoco 原理介绍
  • 小型企业成为网络犯罪分子获取数据的目标