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