c++ Empty template function returns 非空函数指针

c++ Empty template function returns non-empty function pointer

我被模板函数的函数指针搞糊涂了

#include <cstdio>

class A
{
    public:
        A(){}
        ~A(){}
        void command()
        {
            printf("Cmd");   
        }
};

template<class T>
void cmd_create()
{
    T t;
    t.command();
};

int main()
{
    typedef void(*Funcptr)();
    Funcptr f1 = &cmd_create<A>;
    f1();
    return 0;
}

程序输出Cmd.

程序集 (-O3) 表明

    .file   "test.cpp"
    .text
    .section    .rodata.str1.1,"aMS",@progbits,1
.LC0:
    .string "Cmd"
    .section    .text.startup,"ax",@progbits
    .p2align 4,,15
    .globl  main
    .type   main, @function
main:
.LFB38:
    .cfi_startproc
    leaq    .LC0(%rip), %rsi
    subq    , %rsp
    .cfi_def_cfa_offset 16
    movl    , %edi
    xorl    %eax, %eax
    call    __printf_chk@PLT
    xorl    %eax, %eax
    addq    , %rsp
    .cfi_def_cfa_offset 8
    ret
    .cfi_endproc
.LFE38:
    .size   main, .-main
    .ident  "GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0"
    .section    .note.GNU-stack,"",@progbits

显然,&cmd_create<A> return 是 A::command。

将cmd_create定义为一个空的return(void),但是,代码仍然得到A::command这样的奇怪的方式。

感谢您的回答!

Obviously, &cmd_create returns the A::command.

我对汇编不是很流利,但显然你误解了代码 ;)。

&cmd_create<A> 是指向函数 cmd_create<A> 的指针。这个函数指针赋值给f1。指针的类型为 void(*)(),指向返回 void 且无参数的函数的指针。代码 returns 中没有任何功能(如果我们不计算 printfmain)。

f1();调用f1指向的函数。即:cmd_create<A>。该函数创建一个 A 类型的对象并调用它的 command 成员函数,打印您在屏幕上看到的输出。

启用优化意味着编译器发出具有相同可观察行为的东西。它可以发出与 int main() { printf("Cmd"); }.

相同的信号