在c ++ 11中,如果声明了类型,可能导致static_assert失败。所谓宣告,是指向前宣告还是已完全定义。
目的是如果已声明或尚未声明某些内容,则编译失败并显示指示性消息。
除了一个聪明的窍门,我完全希望其中涉及一些尚未成为标准一部分的类似type_traits的中间模板。
如果代码中给定的点不存在某种类型,则不能在那里引用它。为了引用它,您必须声明它。但是,您不知道对它的任何引用都指向哪个声明。有效断言它不存在的唯一可能性是,然后以与早期声明冲突的方式声明或定义它,例如像这样:
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)
。如果类型不存在,则会出现常规错误,而不是断言失败,但我认为这是可以避免的。