【发布时间】:2015-12-14 17:17:50
【问题描述】:
例如,除非incr() 被声明为constexpr,否则下面的代码不会编译:
int incr(int& n) {
return ++n;
}
constexpr int foo() {
int n = 0;
incr(n);
return n;
}
查看 C++14 中的第 7.1.5/3 节,我们有:
constexpr 函数的定义应满足以下条件 约束:
的复合语句
(3.1) — 它不能是虚拟的 (10.3);
(3.2) — 它的返回类型应为文字类型;
(3.3) — 它的每个参数类型都应该是文字类型;
(3.4) — 其函数体应为 = delete、= default 或不包含(3.4.1) — asm 定义,
(3.4.2) — goto 语句,
(3.4.3) — 一个 try 块,或
(3.4.4) — 变量的定义 非文字类型或静态或线程存储持续时间或 不执行初始化。
【问题讨论】:
-
可能值得注意的是previous question,尽管从不同的角度来看,它涵盖了很多相同的领域。
-
@ShafikYaghmour 非常感谢您的 cmets 提出这个新问题。
-
请注意,您引用的内容是 necessary 但不是 sufficient 条件,即如果违反了这些条件,则代码格式不正确,但是,如果它们没有被违反,那么代码可能正确也可能不正确,我们必须查看规范的其他部分。
标签: c++ language-lawyer c++14 constexpr