用12个实例来解释几个C++概念:POD,cv-qualified,trivial,aggregate type

本文通过12个实例详细解释了C++中的POD(Plain Old Data)、trivial构造器以及cv-qualified的概念。POD类型主要用于C和C++的兼容,是不使用封装和面向对象特性的简单数据类型或聚合类。trivial构造器指的是默认由编译器生成的轻量级构造器,不允许用户自定义。cv-qualified是指类型是否可以被const或volatile修饰。文章探讨了这些概念如何影响编译器的行为,并指出不同编译器可能有不同的实现。
摘要由CSDN通过智能技术生成

 

上午Randy同学碰到了一个array中应用tr1::is_pod导致的编译错误,看了一下,顺便了解了一些概念:

 

在开始之前,还是说说什么是tr1

TR1,全称是“C++ Technical Report 1”,实际上是C++标准扩展库ISO/IEC TR 19768的一个俗称,是进入C++标准库的一个提案。TR1中包括的内容主要有:正则表达式(regular expressions)、智能指针(smart pointers),哈希表(hash tables)以及随机数产生器(random number generators),还包括函数对象(Function Objects),元编程和类型属性(Metaprogramming and Type Traits)等等很多内容。TR1本身并不是C++标准,而是一个草案。但是绝大多数情况下提案的内容都会成为下一个官方标准。

参见:

http://en.wikipedia.org/wiki/Technical_Report_1

 

下面说说我们使用is_pod相关的东西。

POD: 全称是“Plain Old Data”,是C++ 98标准(ISO/IEC 14882, first edition, 1998-09-01)中引入的一个概念,主要目的是兼容CC++语言中对数据的比较。实质上POD类型主要包括int, char, float等原始类型及其集合类型(aggregate class)

参见:

http://en.wikipedia.org/wiki/Plain_Old_Data_Structures

http://www.fnal.gov/docs/working-groups/fpcltf/Pkg/ISOcxx/doc/POD.html

 

POD Aggregate Class: 上面刚提到,就是一个只包含POD数据的类,不使用C++中的封装和面向对象的特性。其中还包含的意思是说,POD的定义是可以迭代的,如果一个类只包含POD数据,那这个类就属于POD。以此类推,如果一个类只包含POD数据或者POD类,那它也属于POD

 

最后在说到is_pod之前,说说Randy同学碰到的编译错误:

error C2139: an undefined class is not allowed as an argument to compiler intrinsic type trait '__has_trivial_constructor'

Trivial Constructor:我们经常可以有看到trivial之类的词,到底是什么意思呢?如果去查词典,估计很难理解。个人的理解,就是轻量级的,类似于“浅拷贝”中的“浅”,或许是更浅的浅。Trivial Constructor其实是说更本不允许用户自己定义constructor,即使自己定义的constructor是一个空函数都不行。当然,定义虚函数也不行,因为虚函数会导致编译器自动生成的constructor中包含额外的操作。(这里trivial constructor也是个人不太明确的问题,本意应该是说更本没有constructor,但是MSDN的定义是:__has_trivial_constructor(type): Returns true if the type has a trivial, compiler-generated constructor。因此个人觉得可以理解成,没有constructor,但是不能阻止编译器在实现的时候有自定义的设置)

 

最后终于说到is_pod了,因为使用的是MS的编译器,因此看看MSDN中的解释:

An instance of the type predicate holds true if the type Ty is a scalar type, a POD aggregate type, or a cv-qualified form of one of them, or an array of such a type, otherwise it holds false.

其中还有一个概念“cv-qualified”,看到不同的地方有很多争议,个人觉得这个其实很简单,就是是否可以用const或者volatile修饰。如果可以则是cv-qualified,否则是cv-unqualified。那么你可能会问,还有什么变量不能用const或者volatile来修饰呢?请在下面的例子中查找答案。

 

因此,最后,希望大家可以理解MSDN中那么短短的一句话。

(额外说明:不同的编译器对于is_pod的实现不一定是相同的,这里是用Visual Studio 2008 SP1的编译器来测试的,而且boost中的实现也针对编译器的不同做了不同的定义)

 

下面有12个实例来说明

 

#include <iostream>

#include <type_traits>

 

// === 属于POD的对象 ===

 

// 没有定义任何数据成员

class pod_yes_1 {};

 

// 定义了一个元数据类型的公有成员变量

class pod_yes_2 { public

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值