Всем привет!
Пытаюсь освоить variadic templates, в процессе наткнулся на странное.
Кусок кода:
#include <iostream>
using namespace std;
void variprint() {}
template<class... Args>
void variprint(Args... args) {
//cout << "sizeof: " << sizeof...(args) << endl;
cout << (args << ...) << endl;
}
int main() {
variprint();
variprint("test");
variprint(1, 2);
return 0;
}
Ожидаю, что увижу на выходе:
test
1 2
Запускаю, и вижу:
test
4
Интуитивно догадываюсь, что что-то не так с приоритетами/порядком выполнения операций, и 1 << 2 превратилось в 4.
Окей, запускаю clang с ключиками для промежуточного вывода шаблонов:
clang.exe -std=c++17 -Xclang -ast-print -fsyntax-only my_file.cpp
Лезу в файл и вижу....
void variprint() {
}
template <class ...Args> void variprint(Args ...args) {
cout << "sizeof: " << sizeof...(args) << endl;
cout << (args << ...) << endl;
}
template<> void variprint<<>>()template<> void variprint<<const char *>>(const char *args) {
cout << "sizeof: " << sizeof...(args) << endl;
cout << args << endl;
}
template<> void variprint<<int, int>>(int args, int args) {
cout << "sizeof: " << sizeof...(args) << endl;
cout << args << args << endl;
}
То есть, никаких скобок там в принципе нет, args сразу пишутся в cout.
Вопрос: почему ж в результате оно себя ведёт так, как будто скобки есть??
ЗЫ: на всякий случай попробовал gcc. Результат точно такой же (то есть, на выходе печатает 4, распечатку темплейтов пока не смотрел).
UPD: ХА! А вот https://cppinsights.io/ показывает действительно нормальные темплейты! Со скобками!