那两个lambda被编译成了(没有inline的话)两个普通函数(跟这个Overloader类没有关系的函数)。
调用的时候:
o("1.23");
o(2.34f);
会去调用这两个函数。(当然如果开了优化,这个函数调用肯定就inline了)
func(int):
pushq %rbp
movq %rsp, %rbp
subq $32, %rsp
movl %edi, -20(%rbp)
movl -20(%rbp), %eax
movl %eax, -8(%rbp)
movl -20(%rbp), %eax
movl %eax, -4(%rbp)
leaq -8(%rbp), %rax
movl $.LC0, %esi
movq %rax, %rdi
call func(int)::{lambda(char const*)#1}::operator()(char const*)
const
leaq -8(%rbp), %rax
leaq 4(%rax), %rdx
movl .LC1(%rip), %eax
movd %eax, %xmm0
movq %rdx, %rdi
call func(int)::{lambda(float)#2}::operator()(float) const
nop
leave
ret
说实话,这种写法第一次见到的话确实非常困惑
【 在 ble 的大作中提到: 】
: 模板再怎么用也只是替换,这个地方Overloader没有变参数的构造函数,也没有对应的结构体成员,顶楼代码是不是少写了什么?
: 发自「今日水木 on 钛星」
--
FROM 182.150.115.*