通過過載解決方案違反 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 指的是不同的實體,具體取決於翻譯單元。