12

下面的构造是什么意思?

#include <iostream>

template <int ...> struct s;

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

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

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

4

1 回答 1

13

我将程序重写为:

template <int ...> struct s;

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

    return i;
}

并使用-S-switch 对其进行编译,以获得我清理为以下内容的程序集输出:

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

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

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

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

于 2012-05-30T11:07:42.650 回答