Even with identical tokens for inline functions, ODR can be violated if lookup of names doesn't refer to the same entity. let's consider func
in following:
header.h
void overloaded(int);
inline void func() { overloaded('*'); }
foo.cpp
#include "header.h"
void foo()
{
func(); // `overloaded` refers to `void overloaded(int)`
}
bar.cpp
void overloaded(char); // can come from other include
#include "header.h"
void bar()
{
func(); // `overloaded` refers to `void overloaded(char)`
}
We have an ODR violation as overloaded
refers to different entities depending of the translation unit.