Да, это нарушение ODR применительно к определению Foo
.
[basic.def.odr] параграф 6:
Можнобыть более чем одним определением типа класса ... [или другими объектами, часто определяемыми в заголовочных файлах] ... в программе при условии, что каждое определение появляется в другой единице перевода, и при условии, что определения удовлетворяют следующим требованиям.Если такой объект с именем D
определен более чем в одной единице перевода, то
, каждое определение D
должно состоять из одной и той же последовательности токенов;и
... [другие правила, обеспечивающие одинаковое значение всех определений в их контексте]
Так что любая разницамежду определениями типов классов после этапов предварительной обработки программа получает неопределенное поведение, даже изменяя имя неиспользуемого параметра функции, изменяя unsigned int
на int unsigned
и т. д.