espacios de nombres anónimos y la regla de una definición

¿Estoy violando la Regla de una definición con el siguiente programa?

// foo.hpp
#ifndef FOO_HPP_
#define FOO_HPP_

namespace {
   inline int foo() {
       return 1;
   }
}

inline int bar() {
    return foo();
}
#endif
//EOF

// m1.cpp

#include "foo.hpp"

int m1() {
    return bar();
}

//EOF

// m2.cpp

#include "foo.hpp"

int m2() {
    return bar();
}

//EOF

y finalment

// main.cpp
#include <iostream>

int m1();
int m2();

int main(int, const char* [])
{
    int i = m1();
    int j = m2();

    std::cout << (i+j) << std::endl;
    return 0;
}

// EOF

En lo anterior, tenga en cuenta quefoo() se define en un espacio de nombres anónimo, por lo que espero que cada unidad de traducciónm1.cpp ym2.cpp obtendrá su propia versión, por lo que no hay violación de la ODR. Por otra parte,bar() es simplemente una función en línea antigua que llama a 2 @ diferentfoos. Entonces viola la ODR, ¿verdad?

Actualizar Anteriormente tenía macros en la definición defoo que cambió el valor que devolvió y cada uno dem1 ym2 definió la macro de manera diferente antes de incluirfoo.hpp. (Y con ese ejemplo anterior,g++ produciría un binario que produjera(i+j) con un valor diferente al esperado.)Pero, de hecho, este programa viola la ODR incluso si el cuerpo defoo() es idéntico

Respuestas a la pregunta(2)

Su respuesta a la pregunta