C ++中的引用类型也是POD类型吗?
int&
是POD类型吗?
struct Q { int& i; }
任何人都可以帮助我?
答案 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";
}
输出为1 0 0,因此否对int的引用不是POD。
答案 2 :(得分:4)
POD类型是任何内在类型或内在类型的聚合(基本上,任何没有自定义构造函数,析构函数,复制构造函数,复制赋值运算符,也不是非静态指针到成员类型的东西(更多)详情here)
由于必须通过自定义构造函数设置引用某些内容的成员,因此它将违反第一个要求。简而言之,将引用类型声明为成员的结构不是POD类型。