Подтвердить что ты не робот

Пример необычного шаблона С++

Что означает следующая конструкция?

#include <iostream>

template <int ...> struct s;

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

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

Он скомпилирован gcc 4.4.5+ и при выполнении выходов 0.

4b9b3361

Ответ 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<,>::xxx не генерируется код.

Нижняя линия; это выглядит как ошибка компилятора. Компилятор должен был сообщить об ошибке.

Подтверждающая сторона примечания: я получаю идентичный сборный вывод для программы int main() { int i; return i; }.