constexpr在编译时没有进行评估,如汇编(CALL指令)中所示,为什么?
(使用代码块附带的最新gcc(g ++ 4.7.1)和-std = c ++ 11)
答案 0 :(得分:2)
您的getOdd()
不是constexpr
,并且当然不需要编译器通过非constexpr
函数传播常量表达式。另外,您是否在启用优化的情况下编译?如果没有优化,编译器根本就不会进行任何优化。
答案 1 :(得分:2)
constexpr
不保证编译时评估。它只保证constexpr
,当馈送编译时常量输入本身解析为编译时常量。
在这种情况下,编译器选择不评估getOdd(7)
,即使它可以。 (注意,即使getOdd
,constexpr
本身也不是isEven
。)
编译器可能会选择优化和内联,例如,您可以提高优化级别。但这与constexpr
没什么关系。
答案 2 :(得分:0)
g ++ -O3将在编译时评估表达式。
请注意,更简单的getOdd实现方式是返回t | 1
。