onstrutores @Inline e Regra de Uma Definição

Considere os arquivos de origem 1.cpp

#include <iostream>

using namespace std;

struct X
{
    X()
    {
        cout << "1" << endl;
    }
};

void bar();

void foo()
{
    X x;
}

int main()
{
    foo();
    bar();
    return 0;
}

2.cpp

#include <cstdio>

struct X
{
    X()
    {
        printf("2\n");
    }
};

void bar()
{
    X x;
}

O programa é compilado a partir desses arquivos bem formado? O que deve estar em sua saída?

Eu esperava um erro do vinculador devido à violação da regra de definição única ou à saída "1 2". No entanto, ele imprime "1 1" quando compilado com g ++ 3.4 e VC 8.
Como isso pode ser explicado?

questionAnswers(4)

yourAnswerToTheQuestion