Мои причины, почему это плохая идея.
Увеличение времени компиляции
Каждый отдельный модуль компиляции, который включает заголовок, должен компилировать все файлы заголовков в дополнение к самому источнику. Это, вероятно, увеличит время компиляции и может привести к разочарованию при тестировании кода с небольшими изменениями. Кто-то может утверждать, что компилятор может оптимизировать его, но IMO не может оптимизировать его сверх всякой точки.
Большой сегмент кода
Если все функции написаны inline, это означает, что компилятор должен помещать весь этот код везде, где вызывается функция. Это взорвет сегмент кода, и это повлияет на время загрузки программы, и программа займет больше памяти.
Создает зависимость в клиентском коде с жесткой связью
Всякий раз, когда вы изменяете свою реализацию, каждый клиент должен обновляться (перекомпилируя код). Но если реализация была помещена в независимый общий объект (.so или .dll), клиент должен просто связаться с новым общим объектом.
Также я не уверен, зачем это делать.
//main.cpp
#define LIBFOO_COMPILE_INLINE
#include "libfoo.h"
Если вообще нужно это делать, он (а) мог бы просто поместить код реализации в сам main.cpp. В любом случае, вы можете определить LIBFOO_COMPILE_INLINE только в одном модуле компиляции. В противном случае вы будете дублировать определения.
На самом деле я очень заинтересован в разработке идиомы для написания связного кода шаблона. Когда-нибудь в будущем компилятор C ++ должен поддерживать написание связных шаблонов. Под этим я подразумеваю, что клиенту не нужно перекомпилировать код всякий раз, когда реализация шаблона изменяется.