Я прочитал и перечитал соответствующие пункты о 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;
}