如何检测 class 在 C++ 中是否具有隐式构造函数和原始成员?

How can I detect whether a class has an implicit constructor AND primitive members in c++?

我想在编译时(静态断言)检测一个 class 是否满足以下两个条件:

我们的想法是避免使用具有未初始化成员的对象。我知道在编码过程中有不同的方法可以做到这一点,但我也想要一种在编译过程中检测到这一点的机制。 我尝试使用不同的 std/boost 函数,例如 is_trivially_constructible、is_pod,但其中的 none 提供了我需要的确切术语。

例如,假设我有以下 classes:

struct A
{
  int a;
}

struct B
{
  int* b;
}

struct C
{
  bool c;
  std::string c_str_; 
}

struct D
{
  D();
  float d; 
}

struct E
{
  std::string e;
}

假设我需要的函数被调用 "has_primitive_and_implicit_ctor",我希望每次调用的输出都像评论中那样:

has_primitive_and_implicit_ctor<A>(); //true - A has at least one pod type member (int)
has_primitive_and_implicit_ctor<B>(); //true - A has at least one pod type member (pointer)
has_primitive_and_implicit_ctor<C>(); //true - A has at least one pod type member (bool), even though there is one non-pod member
has_primitive_and_implicit_ctor<D>(); //false - has a pod member(float), but a user defined ctor
has_primitive_and_implicit_ctor<E>(); //false - doesn't have a default ctor but has no pod members

首先,在我看来,期望 class 的用户关心其成员初始化是一个糟糕的设计。您应该确保 class 本身的所有成员都已初始化,而不是在其他使用它的地方。

你要找的东西不存在,即使存在,也帮不了你。显式构造函数的存在并不能保证数据成员被初始化。另一方面,使用 C++11 甚至可以在不显式编写构造函数的情况下初始化数据成员(在 class 声明中使用大括号语法)。另外,您似乎只关心未初始化的 POD 成员,但是未初始化的 non-POD 成员呢?

也就是说,编译器可以生成有关未初始化值的警告,但通常您必须启用此警告(例如 gcc 的 -Wuninitialized 选项)。大多数编译器允许强制将警告视为错误。结合起来,即使没有专门编写代码来测试它,它也可以为您提供所需的效果,并且它也适用于任何未初始化的值,而不仅仅是 classes 中的值。也许这就是您正在寻找的解决方案。