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

一颗西兰花

class Widget { public: template void processPointer(T* ptr) { } private: template void processPointer(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](https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241012/21c68b4a7dedf52a2426601e2b81fbcd.png)

阅读量:138

点赞量:0

问AI
gcc 的 "bug" (https://link.segmentfault.com/?enc=AFFCX%2BYC%2BbtqiiLUAN6DtA%3D%3D.cgk6fE8wo5fAe%2F1Nwosxbg%2BIIgswS3rmu6zlHz5FBJddOR2W9RehwXjKSQSM%2BSzlgkc74%2FzO%2FgGqEo1a5bnvmg%3D%3D)。 c++17 开始标准决定支持在类里特化,然后就有了这个 bug report ,但是现在都还没有修复。