【发布时间】:2020-04-19 14:00:21
【问题描述】:
我试图查看由 g++ 编译的 cpp constexpr 函数的编译代码。 我看到如果函数不返回任何内容,编译器会将其视为常规函数,但如果它返回一个值并将该值分配给 constexpr 变量,则只有在编译时才计算它。
代码示例:
constexpr int func(int x){
return x!=0 ? 1: throw "Error";
}
int main(){
func(2);
}
和编译器输出:
push rbp
mov rbp, rsp
mov edi, 2
call func(int)
mov eax, 0
pop rbp
ret
如您所见,它在运行时调用 func。相反,如果我将函数结果分配给 constexpr:
constexpr int func(int x){
return x!=0 ? 1: throw "Error";
}
int main(){
constexpr int x = func(2);
}
和编译器输出:
main:
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], 1
mov eax, 0
pop rbp
ret
谁能解释一下为什么编译器需要这个赋值来在编译时而不是在运行时评估函数?
【问题讨论】:
-
TIL 你可以将
int和void表达式作为条件的第二和第三个操作数 -
@MM 仅当
void表达式是throw表达式时,因此不需要在条件表达式的结果类型中考虑它,因为throw,如果执行,永远不能为它产生一个值。