为什么带有constexpr函数的模板不会在编译时进行求值

时间:2013-11-22 20:02:40

标签: c++ templates constexpr

enter image description here

constexpr在编译时没有进行评估,如汇编(CALL指令)中所示,为什么?

(使用代码块附带的最新gcc(g ++ 4.7.1)和-std = c ++ 11)

3 个答案:

答案 0 :(得分:2)

您的getOdd()不是constexpr,并且当然不需要编译器通过非constexpr函数传播常量表达式。另外,您是否在启用优化的情况下编译?如果没有优化,编译器根本就不会进行任何优化。

答案 1 :(得分:2)

constexpr不保证编译时评估。它只保证constexpr,当馈送编译时常量输入本身解析为编译时常量。

在这种情况下,编译器选择不评估getOdd(7),即使它可以。 (注意,即使getOddconstexpr本身也不是isEven。)

编译器可能会选择优化和内联,例如,您可以提高优化级别。但这与constexpr没什么关系。

答案 2 :(得分:0)

g ++ -O3将在编译时评估表达式。

请注意,更简单的getOdd实现方式是返回t | 1