当前位置: 首页 > 知识库问答 >
问题:

为什么编译器在数组为零的情况下不推导模板参数?

谭炎彬
2023-03-14

但是这个技巧在零数组的情况下不起作用。为什么下面的代码不正确?例如,联机编译器ideone打印以下错误消息:

错误:调用'size_of_array(int[0])'
std::size_t num=size_of_array(arr)没有匹配的函数

#include <cstddef>
template <typename T, std::size_t N>
inline std::size_t size_of_array( T (&)[N] ) {
   return N;
}
int main()
{
  int arr[0]={};
  std::size_t num = size_of_array(arr);
}

共有1个答案

郑松
2023-03-14

根据标准草案n4296§8.3.4阵列:

声明T D中,其中D的形式为

D1[常量表达式]属性-说明符-seq

 类似资料:
  • 以下内容将无法编译: null 我不明白这里到底出了什么问题。为什么编译器不能从函数参数推导出模板参数? 我需要做什么才能让这个工作?

  • 我正在尝试编写一个简单的模板,我可以使用该模板对带有单个参数的函数进行记忆: 但我得到了一个错误: 错误:没有匹配函数来调用“备忘录(双精度)” 注:候选人是: 注意:模板OUT记忆(IN) 注意:模板参数扣除/替换失败: 为什么编译失败? 实际上,当我指定所有模板参数时,我不明白为什么模板参数推导/替换会发生。 我使用的是gcc版本4.7.2(未启用C 11) PS:模板的错误比我最初意识到的要

  • 我有这个枚举: 并且想实现CustomStringConvertible,所以我做到了。(不要在这上面戳洞,这个问题已经简化了:): 在Playground中运行它完全符合要求。但是,它会在最终的中出错。(同样的运行时失败发生在我的应用程序中,所以这与在游乐场中无关。) 经过大量的头疼和代码设置,我发现这是因为没有实现CustomStringConverable,所以开关中没有匹配的情况。我假设这

  • 考虑以下示例: 而且,如果我们将非类型模板参数的类型改为占位符类型,如下所示: 然后,GCC接受,而Clang拒绝它(两者都拒绝,如上)。 海合会演示,铿锵演示。 (1)GCC HEAD 11.0.0 202 10117和Clang HEAD 12.0.0(20210118),。

  • 我正在编写一个spring-mvc应用程序(并学习spring-mvc)。我没有向pom.xml添加servlet依赖项。当我运行或时,它会成功地完成。不是应该抛出类似“can not find javax.servlet.http.HttpServlet”这样的异常吗?它是如何编译的?

  • 问题内容: 说我有一个清单。在什么情况下被称为? 我基本上理解了文档,但是我也想看到一个示例来毫无疑问地阐明其用法。 问题答案: 当Python尝试将两个对象相乘时,它首先尝试调用左侧对象的方法。如果左对象没有方法(或者该方法返回,表明它不适用于所讨论的右操作数),则Python希望知道右对象是否可以进行乘法。如果右操作数与左操作数的类型相同,Python就会知道它不能,因为如果左对象不能做到这一