namespaces anônimos e a regra de uma definição

Estou violando a regra de definição única com o seguinte program

// 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

e 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

Acima, observe quefoo() é definido em um espaço para nome anônimo, então espero que cada unidade de traduçãom1.cpp em2.cpp terá sua própria versão, portanto não haverá violação do ODR. Por outro lado,bar() é apenas uma função embutida antiga simples que chama 2 diferentesfoos. Então, viola o ODR, certo?

Atualizar Anteriormente, eu tinha macros na definição defoo que alterou o valor retornado e cada um dosm1 em2 definiu a macro de maneira diferente antes de incluirfoo.hpp. (E com o exemplo anterior,g++ produziria um binário que produza(i+j) com um valor diferente do que você esperaria.)Mas, de fato, este programa viola o ODR, mesmo que o corpo defoo() é idêntico.

questionAnswers(2)

yourAnswerToTheQuestion