Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以跨静态断言维护状态?_C++_Constexpr_Static Assert - Fatal编程技术网

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

C++ 是否可以跨静态断言维护状态?,c++,constexpr,static-assert,C++,Constexpr,Static Assert,一段时间前,我遇到了这种需要,被迫去解决它。我想知道是否有一种方法可以在编译时检查中携带状态 例如,一个激励性的例子是如何设置计数器,以便您可以执行以下操作: static_assert(foo() == 0, ".."); static_assert(foo() == 1, ".."); static_assert(foo() == 2, ".."); 其中,每次后续调用都会将结果增加1。我对在编译时完成这项工作特别感兴趣。我曾尝试将foo设置为带有内部计数器的constexpr,但随后遇到

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

例如,一个激励性的例子是如何设置计数器,以便您可以执行以下操作:

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;
}

这在编译时是不可行的:

  • 诸如
    myTest
    之类的对象在运行时实例化
  • 对象可以通过引用或值传递给函数。编译函数时,编译器无法确定引用的是哪个原始对象
  • 如果您的状态是对象独立的,并且在编译时是可行的,那么状态将取决于每个单独编译的单元中状态查询的相遇顺序,而不是执行流(例如,如果在循环中引用状态,则在整个循环中只有一个常量值,无论迭代次数是1次还是1000次)

  • 但是在运行时使用普通变量和断言很容易。

    我不认为
    constexpr
    做你认为它做的事。
    constexpr
    背后的思想是编译器可以计算值并替换计算值,而不必在运行时对其求值。如果计数器应该每次递增y我们的函数被调用,它必须在运行时被评估。编译器无法计算它的返回值。除了Gabe所说的编译器不是C++仿真器之外,它是编译器。记住,我认为问题是我需要静态地断定枚举中的值是按顺序访问的,因为可笑的DE。我正试图找到一种不用硬编码枚举值的方法。