下面的构造是什么意思?
#include <iostream>
template <int ...> struct s;
int main() {
int i = s<,>::xxx;
std::cout << i << std::endl;
}
它由 gcc 4.4.5+ 编译,执行时输出0
。
我将程序重写为:
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<,>::xxx
mystical 表达式生成代码。
底线;这看起来像一个编译器错误。编译器应该给出错误消息。
确凿的旁注:我得到了相同的程序集输出int main() { int i; return i; }
。