Встроенные конструкторы и одно правило определения

Рассмотрим следующие исходные файлы 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;
}

Скомпилирована ли программа из этих файлов правильно? Что должно быть в его выводе?

Я ожидал ошибку компоновщика из-за нарушения правила одного определения или вывода «1 2». Однако он печатает «1 1» при компиляции с g ++ 3.4 и VC 8.0.
Как это можно объяснить?

Ответы на вопрос(2)

Ваш ответ на вопрос