C ++可变参数模板不寻常的例子

时间:2012-05-30 10:44:33

标签: c++ templates gcc c++11 variadic

以下结构意味着什么?

#include <iostream>

template <int ...> struct s;

int main() {
    int i = s<,>::xxx;

    std::cout << i << std::endl;
}

由gcc 4.4.5+编译,执行时输出0

1 个答案:

答案 0 :(得分:13)

我重写了这个程序:

template <int ...> struct s;

int main() {
    int i = s<,>::xxx;

    return i;
}

并使用-S - 开关编译它,以获得我清理的汇编输出:

main:
        pushq   %rbp
        movq    %rsp, %rbp
        movl    -4(%rbp), %eax
        popq    %rbp
        ret

现在,我的asm有点生疏,但唯一重要的代码似乎是movl -4(%rbp), %eax,它将返回值设置为i所能读取的值。换句话说,当输入main函数时,程序只返回堆栈顶部的任何内容。这似乎证实了@ jrok的评论,i的初始化在某种程度上被忽略了。没有为神秘的s<,>::xxx表达式生成代码。

底线;这看起来像编译器错误。编译器应该给出错误消息。

确凿的旁注:我为程序int main() { int i; return i; }获得了相同的程序集输出。

相关问题