Я, вероятно, никогда не скажу никогда, но операторы, которые генерируют данные и код при их разборе, не должны быть в файле .h.
Макросы, встроенные функции и шаблоны могут выглядеть как данные или код, но они генерируют код не при разборе, а при использовании. Эти элементы часто нужно использовать в нескольких .c или .cpp, поэтому они принадлежат .h.
На мой взгляд, заголовочный файл должен иметь минимальный практический интерфейс к соответствующему .c или .cpp. Интерфейс может включать в себя #defines, class, typedef, определения структур, прототипы функций и менее предпочтительные внешние определения для глобальных переменных. Однако, если объявление используется только в одном исходном файле, его, вероятно, следует исключить из .h и вместо этого содержать в исходном файле.
Некоторые могут не согласиться, но мой личный критерий для файлов .h состоит в том, что они #include все остальные файлы .h, которые они должны иметь возможность компилировать. В некоторых случаях это может быть много файлов, поэтому у нас есть несколько эффективных методов для сокращения внешних зависимостей, таких как прямые объявления к классам, которые позволяют использовать указатели на объекты класса, не включая то, что может быть большим деревом включаемых файлов.