Ну, ответ, по сути, стандарт C ++ требует, чтобы он вел себя так, как и он. Это часть правила One Definition .
Практически, компилятор должен генерировать видимую компоновщиком функцию в случае, если вы действительно используете ее в другом месте. Например, должен работать следующий file3.cpp:
void foo();
void call_foo() {
foo();
}
и чтобы это работало, сгенерированный код для foo()
должен быть доступен компоновщику. Компилятор просматривает только один блок перевода (файл .cpp
плюс все, что в нем содержится), поэтому он не может знать, что он фактически генерирует его дважды. Так оно и есть. Тогда компоновщик ловит его.