【发布时间】:2014-02-27 16:05:02
【问题描述】:
当您尝试像这样将 constexpr 与 main 一起使用时:
constexpr int main()
gcc 和 clang 抱怨:
错误:不能将 '::main' 声明为内联
错误:'main' 不允许被声明为 constexpr
我们来看看 constexpr 函数有哪些要求:
constexpr 函数必须满足以下要求:
- 不能是虚拟的
- 它的返回类型必须是 LiteralType
- 它的每个参数都必须是字面量类型
什么是 LiteralType?
文字类型是以下任何一种
- void(c++14 起)
- 标量类型
- 引用类型
- 文字类型的数组
函数体必须包括什么?
- 空语句
- 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?
【问题讨论】:
-
在我看来,有些人似乎痴迷于无处不在使用新的语言功能,不管这是否有意义。
-
这将是摆脱
fork和exec只执行/bin/false所需的功能吗? -
在编译时永远无法知道 argc 和 argv。
-
@JohannesSchaub-litb:你实际上可以优化掉
/bin/false的任何调用! -
问题不在于 constexpr 的定义,而在于 main 的定义
标签: c++ c++11 main language-lawyer constexpr