POD中的static_assert会破坏POD吗?
Will a static_assert in a POD ruin the POD?
我只是想知道…假设我有一个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)中的字符出现在诊断消息中。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 如何在 malloc 内存中初始化非 POD 数据
- 使用 std::index_sequence 初始化具有固定大小数组成员的 POD 结构容器
- Qt5 远程对象 + 自定义类型,但不在 POD 中
- 带有 char[] 字段的 POD 结构的 constexpr 构造
- 如何在 assert() 和 static_assert() 之间调度,如果在 constexpr 上下文中依赖?
- 我关于函数"Assert"的C++代码有问题
- 非 POD 的零初始化
- C++定义构造函数使对象成为非 POD
- 是否可以使用 std::array 作为 POD 结构的数据容器?
- 指向 POD 类型的指针之间的静态转换与重新解释转换
- 具有非 POD 对象的 GLib 异步队列
- assert() 在发布模式下充当标识函数吗?
- 约束类模板函数以接受特定的 POD 类型
- 从基本类型转换为非 POD 结构
- 我可以说服自动生成的构造函数将我的 POD 类成员归零吗?
- 如何编写一个接受如下断言消息的自定义断言函数:assert(false) << "assertio
- 根据 MSVC,具有易失性成员的结构不再是 POD
- 快速将无符号字符的向量强制转换为POD结构的向量,反之亦然
- POD类型是否完全等同于琐碎的标准布局类型