【问题标题】:C++ variadic template unusual exampleC++ 可变参数模板异常示例
【发布时间】:2012-06-04 14:16:43
【问题描述】:

下面的构造是什么意思?

#include <iostream>

template <int ...> struct s;

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

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

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

【问题讨论】:

  • 它在我的机器上输出一些随机值。 i 的初始化被忽略了,i 的初始化值被打印出来。
  • 看起来不合法。 s 从未定义(并且不包含 xxx 成员)并且必须为模板提供非空参数。 (我用gcc 4.6.2编译,打印32767,clang不会编译)。
  • 更改 sxxx 的名称不会改变行为。这几乎可以肯定是 gcc 中的一个错误。似乎该错误是通过向可变参数模板提供空参数来触发的。
  • 字符串的情况更有趣:{ string i = s::xxx; std::cout

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


【解决方案1】:

我把程序改写成这样:

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&lt;,&gt;::xxx-表达式生成代码。

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

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

【讨论】:

    猜你喜欢
    • 2011-06-13
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    相关资源
    最近更新 更多