为什么Main不能成为ConstexPr



当您尝试将constexpr与main一起使用时:

constexpr int main()

GCC和Clang抱怨:

错误:无法声明':: main'将是inline

错误:不允许'MAIN'声明constexpr

让我们看看constexpr函数的要求是:

constexpr函数必须满足以下要求:

  • 它一定不能是虚拟的
  • 其返回类型必须是文字型
  • 其每个参数必须是字面类型

什么是文字?

字面类型是以下任何一种

  • void(自C 14)
  • 标量类型
  • 参考类型
  • 一系列字面类型

功能体必须包括什么?

  • null语句
  • static_assert声明
  • 未定义类或枚举的Typedef声明和别名声明
  • 使用声明
  • 使用指令
  • 正是一个仅包含文字值,constexpr变量和函数的返回语句。

以下示例:

constexpr int main() { ; }
constexpr int main() { return 42; }
constexpr int main() {
// main defaults to return 0 
}

似乎符合所有这些要求。此外,main是特殊功能,在程序的开头运行。您可以从main运行constexpr函数,为了使标记为constexpr成为constexpr的东西,必须在constexpr上下文中运行。

那么,为什么不允许main成为Constexpr?

no,不允许在3.6.1 主函数中的C 标准草案段落 3 说:

[...]将main定义为已删除或声明为hinline,static或constexpr的程序是不形成的。[...]

main必须是一个运行时函数,正如Lightness所说的那样,这是没有意义的,因为您无法优化main

标准给出了main的精确签名,因此允许编译器拒绝其他签名。更具体地说,它规定了main不能是constexprstatic或其他一些东西。

如果您想知道为什么,允许编译器在main的开头插入代码(做诸如初始化全局变量等),这可能使其成为非constexpr(它这就是为什么不允许程序明确拨打主的原因)。

,将main声明为 constexpr没有任何意义,原因有两个:1)这是一个运行时函数。2)可能不会从其他功能或递归中调用它。

在我看来,将main()声明为constexpr是没有意义的,标准委员会希望C 编程语言有意义。

函数main()是一个特殊功能,用于处理程序入口点初始化 - 使用它来计算编译时值是不明智的。

相关内容

  • 没有找到相关文章

最新更新