POD中的static_assert是否会破坏POD?

时间:2015-08-04 08:45:15

标签: c++ types assert static-assert

我只是想知道......让我们说我在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;
}

1 个答案:

答案 0 :(得分:4)

在C ++ 11中,如果类型为POD,则视为

  • trivial(标量类型,具有普通默认构造函数的简单可复制类,或此类型/类的数组)
  • standard layout(没有虚函数,没有虚基类等)

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

static_assert用于在编译时验证某些内容,并且在构造,复制等对象时不会改变对象布局或无关紧要(或缺乏对象)。因此,向类型(结构/类)添加任意数量的静态断言不应该改变它的POD。

您可以使用std::is_pod<T>::value检查编译器是否将类型视为POD。在向其添加static_assert之前和之后,这不会发生变化。

这就是标准所说的关于static_assert的所有内容。来自 [dcl.dcl]

  

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