Если вызов функции variadic переводится в нажатие указателей аргументов,…
Это не так, как работают функции variadic. значения аргументов, а не указатели на аргументы, передаются после специальных правил преобразования для встроенных типов (таких как char в int).
C ++ 03 §5.2.2p7:
Когда для данного аргумента нет параметра, аргумент передается таким образом, что принимающая функция может получить значение аргумента, вызвав va_arg (18.7).Стандартные преобразования lvalue-to-rvalue (4.1), массив-указатель (4.2) и функция-указатель (4.3) выполняются в выражении аргумента.После этих преобразований, если аргумент не имеет арифметику, перечисление, указатель, указатель на член или тип класса, программа становится некорректной.Если аргумент имеет тип класса не POD (раздел 9), поведение не определено.Если аргумент имеет целочисленный тип или тип перечисления, на который распространяется продвижение по типу (4.5), или тип с плавающей запятой, который подлежит продвижению с плавающей запятой (4.6), значение аргумента преобразуется в повышенный тип до вызова,Эти продвижения называются продвижениями аргументов по умолчанию.
В частности, из вышесказанного:
Если аргумент имеет тип класса не POD (пункт 9),поведение не определено.
C ++ указывает на C для определения va_arg, а C99 TC3 §7.15.1.2p2 говорит:
… если тип не совместим стип фактического следующего аргумента (как продвигается в соответствии с продвижением аргументов по умолчанию), поведение не определено, за исключением следующих случаев: [список случаев, которые здесь не применяются]
Таким образомЕсли вы передаете тип класса, это должен быть POD, а принимающая функция должна применять правильный тип, в противном случае поведение не определено.Это означает, что в худшем случае он может работать точно так, как вы ожидаете.
Printf не будет применять правильный тип для любого пользовательского типа класса, так как он не знает о них, поэтому вы не можете передать любой UDTТип класса для печати.Ваш foo делает то же самое, используя указатель на символ вместо правильного типа класса.