问题描述
基于cppreference.com,如果没有非静态成员初始化器,那么默认构造函数被认为是平凡的,这是否意味着如果我们添加一个静态成员,默认构造函数仍然是平凡的,类类型是POD ?换句话说,如果在一个 C 兼容的类类型中我们声明并初始化了一个静态成员,我们是否仍然可以将 struct 视为 POD 类型?例如,
struct PodType {
static int n = 10;
float x;
float y;
};
上述 struct C 兼容 (POD) 吗?
解决方法
感谢所有有用的评论,我可以有把握地说,在添加静态成员后,结构仍然是微不足道的(又名 POD)。
此外,<type_traits> 提供了各种方便的帮助器来检查类型的特征,例如 is_trivial
。类似地,编译器对类型特征有特定的支持,例如 Microsoft C++ compiler 我们可以使用 __is_pod
。
#include <stdio.h>
#include <type_traits>
struct Foo {
static constexpr int n = 10;
float x;
float y;
};
int main () {
// msvc compiler-specific type trait:
__is_pod(Foo) == true ? printf("true\n") : printf("false\n");
// <type_traits> header type trait:
std::is_trivial<Foo>::value ? printf("true\n") : printf("false\n");
return (0);
}