У меня есть этот код, который играет с функциями variadi c:
#include <cstdarg>
#include <iostream>
template <typename T>
void bar(va_list vl) {
std::cout << va_arg(vl, T) << std::endl;
}
void foo(int n, ...) {
va_list vl;
va_start(vl, n);
while (n--) {
bar<int>(vl);
}
va_end(vl);
}
int main() {
foo(3, 1, 2, 3);
return 0;
}
К сожалению, вывод этого кода зависит от платформы. В G CC 7 я получаю:
1
2
3
, тогда как в MSV C 2015 это
1
1
1
Я пытаюсь написать код для получения вывода G CC , но я полагаю, что я делаю что-то не так, и я понятия не имею, где. Какой правильный вывод, если есть?
Оба компилятора установлены на максимальный уровень предупреждения, но они не выводят никаких предупреждений. В MSV C, являющемся va_list
псевдонимом char*
, вывод имеет смысл. В G CC это встроенный тип , и я понятия не имею, что там происходит.
Редактировать:
Если я изменю определение от bar
до void bar(va_list& vl)
, тогда выходы такие же. Законно ли передавать va_list
по ссылке?