static_assert(如果声明了类型)
static_assert if a type is declared
在c++11中,如果声明了类型,是否可能导致static_assert失败。我所说的已声明,是指前瞻性声明还是完全定义。
其目的是,如果某个东西已经声明或尚未声明,则会显示一条指导性消息,使编译失败。
除了一个巧妙的技巧外,我完全希望会涉及一些中间的type_traits-like模板,这还不是标准的一部分。
如果一个类型在代码中的某个给定点不存在,那么您就不能在那里引用它。为了引用它,你必须声明它。但你不知道它的任何用法指的是哪个声明。有效断言它不存在的唯一可能性是以与早期声明相冲突的方式声明或定义它,例如:
struct Type; // Earlier declaration.
// Whatever, then:
using Type = struct Unique_temporary_name*; // "Type" must not exist.
您可以静态地断言它的大小是您所期望的。
typedef struct _ListNode {
struct _ListNode* next;
int value;
} ListNode;
static_assert(sizeof(ListNode) >= sizeof(void*) + sizeof(int));
如果类型存在,它将与任何其他static_assert(…)
一样工作,如果不是更好的话,因为这也会检查类型的大小。(如果你不想这样,你可以简单地static_assert(sizeof(ListNode) >= 1)
。如果类型不存在,你会得到一个常规错误,而不是断言失败,但我认为这是无法避免的。
Nit:由于编译器添加了填充字节,所以需要>=,除非要包含#pragma pack(1)
相关文章:
- 将类型声明为类型模板参数的模板参数的一部分是否合法?
- 当返回类型声明为 ListNode 时,我们是否可以返回 false<T>*
- 如何使用自定义类型声明Arduino数组?
- 将函数参数类型声明为 auto
- 使用typedef'ed返回类型声明友元函数时出现编译器错误
- 在没有标识符的情况下如何读取复杂的C++类型声明?
- 模板函数参数显式类型声明
- 使用指针遍历一系列基元类型声明?
- 字符类型声明和验证
- 使用本地类型声明的G lambda被使用但从未定义 - 确实是一个错误
- 为什么 c++ lambda 捕获不需要类型声明?
- 为什么没有"int"类型声明时输出不同?
- C++如何使用虚拟基类型声明全局静态分配的变量
- 我可以使用预处理器将一个类型声明替换为另一个类型声明吗?
- 如何将数据类型声明从.cpp文件传输到 .cu 文件
- C++17 枚举类型声明
- 条件类型声明
- 具有特定参数的特定构造函数的类型声明
- 我可以使用相同的名称为周围作用域中的类型声明成员类型别名吗
- 函数调用之前,C 类型声明