我只是想知道......让我们说我在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;
}
答案 0 :(得分:4)
在C ++ 11中,如果类型为POD,则视为
基本上没有什么会妨碍复制对象,好像它们只是由原始字节组成。
static_assert
用于在编译时验证某些内容,并且在构造,复制等对象时不会改变对象布局或无关紧要(或缺乏对象)。因此,向类型(结构/类)添加任意数量的静态断言不应该改变它的POD。
您可以使用std::is_pod<T>::value
检查编译器是否将类型视为POD。在向其添加static_assert
之前和之后,这不会发生变化。
这就是标准所说的关于static_assert
的所有内容。来自 [dcl.dcl] :
在 static_assert-declaration 中,常量表达式应该是一个常量表达式,可以在上下文中转换为
bool
。如果转换后的表达式的值为true,则声明无效。否则,程序格式错误,并且生成的诊断消息(1.4)应包括字符串文字的文本,但不包括不在基本源字符集(2.3)中的字符出现在诊断消息中。