C ++中的引用类型是POD类型吗?

时间:2013-10-02 18:22:16

标签: c++ pod

C ++中的引用类型也是POD类型吗? int&是POD类型吗?

怎么样?
struct Q { int& i; }

任何人都可以帮助我?

3 个答案:

答案 0 :(得分:9)

没有

设置引用某些内容的成员的唯一方法是通过用户声明的构造函数,因此,您的结构是非POD。

<强>更新
答案仍然是否定的。

C ++ 03标准指定“ A POD-struct是一个聚合类,它没有非POD-struct类型的非静态数据成员,非POD-union(或这类类型的数组) )或参考,和...... “(C ++ 03标准第9节第5段)。

在C ++ 11中,POD结构“是一个既简单的类又是标准布局类的类,而且...... ”和标准布局类“< em>没有类型为非标准布局类(或此类类型的数组)或引用的非静态数据成员“(C ++ 11标准第9节第6-9段)。

我解析以“或引用”结尾的那些短语,以立即表示POD类不能包含任何引用类型的非静态数据成员。在“或引用”之前缺少逗号确实让位于其他解释(例如,它是对非POD类的引用,使引用变坏,而不是引用本身),但是我坚持我的解释。

答案 1 :(得分:6)

有一种标准方法(使用C ++ 11)在编译时确定。

#include <iostream>
#include <type_traits>

struct Q
{
    int& i;
};

int main()
{
    std::cout << std::is_pod<int>::value << "\t";
    std::cout << std::is_pod<int&>::value << "\t";
    std::cout << std::is_pod<Q>::value << "\n";
}

演示:http://ideone.com/PECzfT

输出为1 0 0,因此对int的引用不是POD。

答案 2 :(得分:4)

POD类型是任何内在类型或内在类型的聚合(基本上,任何没有自定义构造函数,析构函数,复制构造函数,复制赋值运算符,也不是非静态指针到成员类型的东西(更多)详情here

由于必须通过自定义构造函数设置引用某些内容的成员,因此它将违反第一个要求。简而言之,将引用类型声明为成员的结构不是POD类型。