为啥C++模板特化在g++编译错误但是clang++成功编译?

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

编译结果:
image.png

阅读 975
1 个回答

gcc 的 bug

c++17 开始标准决定支持在类里特化,然后就有了这个 bug report ,但是现在都还没有修复。