C++ 可变参数模板异常示例

标签 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.

最佳答案

我把程序改写成这样:

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 生成代码-表达式。

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

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

关于C++ 可变参数模板异常示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10814705/

相关文章:

c++ - 数组嵌套代理

c++ - 在不违反严格的别名规则的情况下调用 FFTW 的就地实数到复数转换

c++ - Qt启动cmd.exe

html - 电子邮件模板管理器工具

C++ 可变参数模板 - 限制参数的数量

c++ - 如何将 Doxygen 的 "Documentation at other places"功能与专门的模板类一起使用?

c - gcc 编译器中关于 fork() 的歧义

c - 限制 Linux 静态库中的符号

c++ - 在 C++ (STL) 的结构中声明的方法

c++ - Berkeley 套接字 API 与 C++ 网络编程库