class Widget {
public:
template<typename T>
void processPointer(T* ptr)
{ }
private:
template<>
void processPointer<void>(void*);
};
int main()
{
Widget w;
w.processPointer(new int());
return 0;
}
补充clang++编译后的汇编代码:
.text
.file "private.cpp"
.globl main # -- Begin function main
.p2align 4, 0x90
.type main,@function
main: # @main
.cfi_startproc
# %bb.0:
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
subq $16, %rsp
movl $0, -4(%rbp)
movl $4, %edi
callq _Znwm@PLT
movq %rax, %rsi
movl $0, (%rax)
leaq -8(%rbp), %rdi
callq _ZN6Widget14processPointerIiEEvPT_
xorl %eax, %eax
addq $16, %rsp
popq %rbp
.cfi_def_cfa %rsp, 8
retq
.Lfunc_end0:
.size main, .Lfunc_end0-main
.cfi_endproc
# -- End function
.section .text._ZN6Widget14processPointerIiEEvPT_,"axG",@progbits,_ZN6Widget14processPointerIiEEvPT_,comdat
.weak _ZN6Widget14processPointerIiEEvPT_ # -- Begin function _ZN6Widget14processPointerIiEEvPT_
.p2align 4, 0x90
.type _ZN6Widget14processPointerIiEEvPT_,@function
_ZN6Widget14processPointerIiEEvPT_: # @_ZN6Widget14processPointerIiEEvPT_
.cfi_startproc
# %bb.0:
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
movq %rdi, -8(%rbp)
movq %rsi, -16(%rbp)
popq %rbp
.cfi_def_cfa %rsp, 8
retq
.Lfunc_end1:
.size _ZN6Widget14processPointerIiEEvPT_, .Lfunc_end1-_ZN6Widget14processPointerIiEEvPT_
.cfi_endproc
# -- End function
.ident "Ubuntu clang version 14.0.0-1ubuntu1.1"
.section ".note.GNU-stack","",@progbits
.addrsig
.addrsig_sym _ZN6Widget14processPointerIiEEvPT_
.addrsig_sym _Znwm
编译结果:
gcc 的 bug。
c++17 开始标准决定支持在类里特化,然后就有了这个 bug report ,但是现在都还没有修复。