递归constexpr函数 我正在阅读有效的现代C++,想用STORM表达式尝试一个非常基本的函数。我的C++技巧真的不是很好,但是我不能理解这个基本代码有什么问题: constexpr int test( int x ) { // works if: return x == 43337, otherwise segmentation fault return x > 1000000 ? x+1 : test( x + 1 ); } int main(int argc, char const *argv[]) { constexpr auto x = 0; cout << "Result: " << test( x ); return 0; } constexpr int测试(int x){ //如果:返回x==43337,则工作,否则为分段故障 返回x>1000000?x+1:测试(x+1); } int main(int argc,char const*argv[] { constexpr auto x=0; cout

递归constexpr函数 我正在阅读有效的现代C++,想用STORM表达式尝试一个非常基本的函数。我的C++技巧真的不是很好,但是我不能理解这个基本代码有什么问题: constexpr int test( int x ) { // works if: return x == 43337, otherwise segmentation fault return x > 1000000 ? x+1 : test( x + 1 ); } int main(int argc, char const *argv[]) { constexpr auto x = 0; cout << "Result: " << test( x ); return 0; } constexpr int测试(int x){ //如果:返回x==43337,则工作,否则为分段故障 返回x>1000000?x+1:测试(x+1); } int main(int argc,char const*argv[] { constexpr auto x=0; cout,c++,recursion,constexpr,decltype,effective-c++,C++,Recursion,Constexpr,Decltype,Effective C++,在您的代码中,您没有在需要编译时计算的上下文中调用test,因此编译器可以在运行时自由地计算调用,从而导致segfault 通过使用结果初始化constepr变量,可以强制调用test的编译时上下文: constexpr auto result = test( x ); // error 这提供了一个预期的结果: error: constexpr variable 'result' must be initialized by a constant expression constexp

在您的代码中,您没有在需要编译时计算的上下文中调用
test
,因此编译器可以在运行时自由地计算调用,从而导致segfault

通过使用结果初始化
constepr
变量,可以强制调用
test
的编译时上下文:

constexpr auto result = test( x );  // error
这提供了一个预期的结果:

error: constexpr variable 'result' must be initialized by a constant expression
  constexpr auto result = test( x );
                 ^        ~~~~~~~~~
note: constexpr evaluation exceeded maximum depth of 512 calls
...

您知道编译器必须在编译时触发此函数1000000次吗?我怀疑它是否能够处理它。您确定要在constexpr上下文中调用此函数吗?否则,您的递归函数可能会耗尽堆空间。顺便说一句:您的示例运行得很好:或者:@ALX23z没有似乎是个问题。OP甚至声明没有编译器错误。