Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/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++_Templates_Require_C++20_C++ Concepts - Fatal编程技术网

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

C++ 为什么使用一个无效的概念被认为是不正确的,c++,templates,require,c++20,c++-concepts,C++,Templates,Require,C++20,C++ Concepts,新发布的草案中提到: 如果将模板参数替换为需求 总是导致替换失败,程序格式不正确;不 需要诊断。[示例: 模板概念C= 需要{ 新的int[-(int)sizeof(T)];//格式错误,无需诊断 }; -[示例] 但是为什么我们不能保证诊断总是失败,而不是跳过诊断呢?需求表达式几乎可以做任何事情。它们可以引发进一步的模板替换,通过任意数量的代码向外级联。回想一下,模板替换构成了一个复杂的过程 因此,您要求编译器,给定一个图灵完整程序,证明是否存在导致该程序格式良好的输入。这只是对停顿问题的重

新发布的草案中提到:

如果将模板参数替换为需求 总是导致替换失败,程序格式不正确;不 需要诊断。[示例:

模板概念C=
需要{
新的int[-(int)sizeof(T)];//格式错误,无需诊断
};
-[示例]


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

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

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


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

我知道你想说我可以删除第一行和最后一行的代码格式,但我无法提交它,因为标记检查的限制…现在更好了吗@是的,谢谢!问题是“为什么这不需要诊断”还是“为什么我们不能让它只计算为
false
”?@t.C.你的意思是我错误地理解了“诊断”的含义?谢谢,我会重新检查它,但不是现在,因为它在中国已经是0:13了。在我看来,支持交叉编译的语言应该设计成原始递归的,而不是图灵完成的。当然,除了资源限制外,执行应该是图灵完成的,但处理应该被分割成一个构建过程,该过程保证在有限的时间内完成(成功或失败),在构建环境中没有无限的副作用,以及可在单独的执行环境中执行的单独的执行过程。构建过程中的图灵完整性是一个bug,而不是一个特性。感谢您的解释。我只是一名高中生,所以也许关于图灵全集的一些东西暂时对我来说太模糊了。尽管如此,我还是想问你,让它形成错误和让总是失败的概念有效有什么区别?如果后者是真的,编辑者会做额外的工作吗?@supercat:你对错误的答案发表了评论吗?这个问题与构建过程或交叉编译无关。@JohnDing请参见@JohnDing:Halting问题是一个著名的编程问题。停止问题要求您设计一个算法,该算法接受一个程序,并告诉您该程序是否会在所有可能的输入上停止。事实证明,要设计出一种适用于所有程序的算法是不可能的。要求编译器检测永远不会计算为有效表达式的表达式就是要求编译器解决停止问题。C++标准不要求编译器做一些证明是不可能的事情。
template<typename T> concept C =
requires {
  new int[-(int)sizeof(T)];     // ill-formed, no diagnostic required
};