POD中的static_assert是否会破坏POD?

atl*_*ste 5 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;
}
Run Code Online (Sandbox Code Playgroud)

leg*_*s2k 4

在 C++11 中,如果类型满足以下条件,则该类型被视为POD:

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

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

static_asserts 用于在编译时验证某些内容,并且不会更改对象布局或对象构造、复制等过程中的琐碎性(或缺乏琐碎性)。因此,向类型(结构/类)添加任意数量的静态断言不应改变其 POD 性。

您可以使用 来检查编译器是否正在将某种类型视为 POD std::is_pod<T>::valuestatic_assert在添加s之前和之后这不会改变。

这就是标准中关于static_asserts 的全部内容。来自[dcl.dcl]

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

  • @atlaste:我不记得有明确的禁令(这需要检查整个标准),但我相信人们普遍认为编译器不能仅仅因为他们喜欢就添加虚拟函数。根据标准添加虚函数的唯一方法是声明一个或继承一个。(IOW,共识是这是一个详尽的列表) (3认同)