是否可以跨静态断言维护状态

Can state be maintained across static asserts?

本文关键字:断言 维护 状态 静态 是否      更新时间:2023-10-16

前段时间遇到这个需求,并被迫解决它。我想知道是否有一种方法可以在编译时检查时携带状态。

例如,一个激励的例子是如何设置计数器这样你就可以这样做:

static_assert(foo() == 0, "..");
static_assert(foo() == 1, "..");
static_assert(foo() == 2, "..");

每次后续调用将结果增加1。我对在编译时实现这一点特别感兴趣。我曾尝试将foo设置为具有内部计数器的constexpr,但随后遇到只读约束。我想知道在当前的c++标准中是否有可能实现这些。

int main() {
    static constexpr int counter = 0; 
    struct test
    {
        constexpr int foo(){return counter++;}
    };
    test myTest;
    static_assert(myTest.foo() == 0, "failed");
    static_assert(myTest.foo() == 1, "failed");
    return 0;
}

这在编译时是不可行的:

  1. 对象如myTest是在运行时实例化的。
  2. 对象可以通过引用或值传递给函数。当编译函数时,编译器不能确定它所引用的是哪个对象。
  3. 如果你的状态是对象独立的,如果它在编译时是可行的,那么状态将取决于每个单独编译单元中状态查询的遇到顺序,而不是执行流(例如,如果状态在循环中被引用,那么在整个循环中它将只有一个常量值,无论是否有1或1000次迭代)。

但是在运行时很容易,使用正常的变量和断言。