提问者:小点点

为什么使用一个无效的概念被认为是不正确的


新公布的草案在[expr.prim.req]/6中提到:

如果将模板参数替换为需求总是会导致替换失败,则程序格式错误;无需诊断。[

template<typename T> concept C =
requires {
  new int[-(int)sizeof(T)];     // ill-formed, no diagnostic required
};

但是为什么我们不能保证诊断总是失败,而不是跳过诊断呢?


共1个答案

匿名用户

需求表达式几乎可以做任何事情。它们可以引发进一步的模板替换,通过任意数量的代码向外级联。回想一下,模板替换构成了一种Turning完整语言。

所以你要求编译器,给定一个图灵完备的程序,证明是否有一些输入导致该程序格式良好。这只是停止问题的重述。就像停止问题一样,在一些简单的情况下,程序显然停止/不停止。但是当你处理图灵完备的语言时,它可能会变得任意复杂。

该标准不会强制编译器解决暂停问题。