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)
在 C++11 中,如果类型满足以下条件,则该类型被视为POD:
基本上没有什么会妨碍复制对象,就好像它们只是由原始字节构成一样。
static_assert
s 用于在编译时验证某些内容,并且不会更改对象布局或对象构造、复制等过程中的琐碎性(或缺乏琐碎性)。因此,向类型(结构/类)添加任意数量的静态断言不应改变其 POD 性。
您可以使用 来检查编译器是否正在将某种类型视为 POD std::is_pod<T>::value
。static_assert
在添加s之前和之后这不会改变。
这就是标准中关于static_assert
s 的全部内容。来自[dcl.dcl]:
在static_assert 声明中,常量表达式应是可以根据上下文转换为 的常量表达式
bool
。如果转换后表达式的值为 true,则该声明无效。否则,程序格式错误,并且生成的诊断消息 (1.4) 应包括字符串文字的文本,但不要求基本源字符集 (2.3) 中的字符不需要出现在诊断消息中。