Я прочитал и перечитал соответствующие статьи об ODR в стандарте C ++, но этот вопрос все еще остается для меня открытым. Стандарт говорит, что определение встроенной функции должно появляться в каждой единице перевода, в которой она используется, и определения должны быть идентичными в том смысле, который описан почти на странице. В нем говорится, что последовательность токенов должна быть такой же. Включает ли он имена локальных идентификаторов?
Другими словами, нарушает ли следующая программа ODR? (я сам пытался протестировать ее с помощью Visual Studio 2008 и получил 0 ошибок и 0 предупреждений. Но я полагаю, что это не так » Я ничего не могу доказать, потому что затем я изменил пример на два совершенно разных определения и по-прежнему получил 0 ошибок и 0. Извиняясь за MSVC, следует отметить, что формально диагностика нарушений ODR не требуется).
//main.cpp
inline int f(int);
int main(){
f(3);
}
int f(int x){
int z = x;
return z*z;
}
//other.cpp
inline int f(int xx){
int zz = xx;
return zz*zz;
}