通过重载解决方案违反 ODR

即使使用相同的内联函数标记,如果查找名称不是指同一实体,也可能违反 ODR。让我们考虑下面的 func

  • 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)`
    }
    

我们有 ODR 违规,因为 overloaded 指的是不同的实体,具体取决于翻译单元。