作者:小心大巧 | 来源:互联网 | 2022-12-10 12:41
我最近试验过C++ 17并发现了这个:
template
void recurse()
{
if constexpr(i == 0)
return;
return recurse();
}
试着打电话recurse<4>();
会导致
fatal error: template instantiation depth exceeds maximum of 900 (use -ftemplate-depth= to increase the maximum)
return recurse();
添加其他修复错误:
template
void recurse()
{
if constexpr(i == 0)
return;
else
return recurse();
}
这是一个错误吗?不幸的是,我现在无法访问除gcc 7.3.0之外的其他编译器.
1> max66..:
不:不是错误.
这两个if constexpr
和else
是必要的.
在你的第一个版本
template
void recurse()
{
if constexpr(i == 0)
return;
return recurse();
}
的recurse()
还编译时i == 0
,从而产生recurse<-1>()
,从而产生recurse<-2>()
等
在结束递归时,您需要else
链接return recurse()
到if constexpr (i == 0)
并避免编译i == 0
.
您可以尝试删除第二个版本 constexpr
template
void recurse()
{
if (i == 0)
return;
else
return recurse();
}
并且你应该得到相同的"模板实例化深度超过最大值900"的递归错误.
@HenrikS - 据我所知,编译器*可以*删除无法访问的代码; 用`if constexpr`(以及相应的`else`)*必须*删除它.那个&#39;else`是必要的,以确保删除不必要的代码.