POD中的static_assert会破坏POD吗?

Will a static_assert in a POD ruin the POD?

本文关键字:POD assert 中的 static      更新时间:2023-10-16

我只是想知道…假设我有一个c++中的POD结构。如果我在这里放一个static_assert,会破坏它是POD的事实吗?

我知道我可以很容易地把它放在其他地方,我只是问,因为我很感兴趣,如果我应该或不应该这样做…

换句话说(更具体):

#include <iostream>
#include <type_traits>
struct A 
{
    void* ptr;
    static_assert(sizeof(void*) == 8, "Pointer should have size 8; platform unsupported");
};
int main()
{
    // Is it guaranteed that this will evaluate to 'true'?
    std::cout << std::is_pod<A>::value << std::endl;
}

在c++ 11中,如果一个类型

  • trivial(标量类型,具有普通默认构造函数的普通可复制类,或此类类型/类的数组)
  • 标准布局(没有虚函数、虚基类等)

基本上没有什么会阻碍复制对象,就好像它们只是由原始字节组成的。

static_assert的存在是为了在编译时验证某些东西,并且不会改变对象的布局或构造,复制等对象的琐碎(或缺乏)。因此,向类型(结构/类)添加任何数量的静态断言都不应该改变它的pod性。

您可以使用std::is_pod<T>::value检查编译器是否将类型视为POD。这在加入static_assert s前后没有变化。

这就是标准中关于static_assert s的全部内容。从 [dcl.dcl] :

static_assert-declaration中,常量表达式必须是一个可以在上下文中转换为bool的常量表达式。如果转换后表达式的值为true,则声明无效。否则,程序是错误格式的,产生的诊断消息(1.4)应包括字符串文本的文本,除非不需要在基本源字符集(2.3)中的字符出现在诊断消息中。