编辑“︁
C++11
”︁(章节)
跳转到导航
跳转到搜索
Template:Editnotice load/content
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
=== 對POD定義的修正 === 在C++03中,一個类(class)或結構(struct)要想被作为[[POD (程序设计)|POD]],必須遵守幾條規則。符合這種定義的型別能夠產生與C相容的物件内存佈局(object layout),而且可以被静态初始化。但C++03标准严格限制了何种类型与C兼容或可以被静态初始化的,尽管并不存在技术原因导致编译器无法处理。如果创建一个C++03 POD类型,然后为其添加一个非虚成员函数,这个类型就不再是POD类型了,从而无法被静态初始化,也不再与C兼容,尽管其内存布局并没有发生变化。 C++11通过把POD概念划分成两个概念:''平凡的(trivial)''和标准布局''(standard-layout)'',放寬了關於POD的定義。 一个平凡的类型可以被静态初始化,意味着使用<code>memcpy</code>来复制数据是合法的,而无须使用复制构造函数。平凡的类型对象的生命周期开始于其存储空间被分配时,而不是其构造函数完成时。使用模版类std::is_trivial<T>::value来判断数据类型是否为平凡类型 一個平凡的類別或結構符合以下定義: # 平凡的預設建構式。這可以使用[[#使用或禁用物件的預設函式|預設建構式語法]],例如<code>SomeConstructor() = default;</code> # 平凡的複製建構式和move构造函数,可使用預設語法(default syntax) # 平凡的賦值運算子和move赋值操作符,可使用預設語法(default syntax) # 平凡的解構式,不可以是虛函数(virtual) # 类没有虚基类和虚成员函数 # 复制构造函数和赋值操作符还额外要求所有非静态数据成员都是平凡的。 一个符合标准布局的类封装成员的方式与C兼容。使用模版类std::is_standard_layout<A>::value来判断类型是否是一个标准布局类型。一個標準佈局(standard-layout)的類別或結構符合以下定義: # 所有non-static成員有相同的存取控制(public,private,protected) # 沒有虛擬函式 # 沒有虛基類 # 所有基礎類別符合標準佈局 # 所有非靜態的(non-static)資料成員属于符合標準佈局的類別 # 类中第一个非静态類別与基类不是同一个類別。例如:struct A:B{ B b; int c;}不符合要求 # 两种情况必局其一:或者所有基礎類別都没有non-static成員;或者最派生類別沒有non-static資料成員且至多一個帶有non-static成員的基礎類別。基本上,在該類別的繼承體系中只會有一個類別帶有non-static成員。 一个类、结构、联合只有在其是平凡的、符合标准布局,并且所有非静态成员和基类都是POD时,才被视为POD。使用<type_traits>中的is_pod<T>::value判断T是不是POD类型 通过划分,使得放弃一个特性而不失去另一个成为可能。一个具有复杂的复制和move构造函数的类可能不是平凡的,但是它可能符合标准布局,从而能与C程序交互。类似地,一个同时具有public和private数据成员的类不符合标准布局,但它可以是平凡的,从而能够使用<code>memcpy</code>来复制。
摘要:
请注意,所有对Local Chinese Wikipedia的贡献均可能会被其他贡献者编辑、修改或删除。如果您不希望您的文字作品被随意编辑,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源(详情请见
Project:著作权
)。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
导航菜单
个人工具
未登录
讨论
贡献
创建账号
登录
命名空间
页面
讨论
大陆简体
不转换
简体
繁體
大陆简体
香港繁體
澳門繁體
大马简体
新加坡简体
臺灣正體
查看
阅读
编辑
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息