1) Я вижу одно определенное преимущество этого подхода: вы всегда видите значение определенной константы в нужном месте.Т.е., если константы определены как extern, вам нужно было бы поместить определения в один cpp-файл вместе с инициализаторами и оставить заголовок с extern const без значения, что могло бы немного ввести сторонников в заблуждение.
Недостаток, который вы упомянули (невозможность использовать их в качестве параметра шаблона), на самом деле второстепенный, вам часто нужен параметр шаблона std :: string?К счастью, я их не видел.
2) Может быть, еще одним второстепенным является то, что у вас есть дубликаты объектов std :: string на самом деле в каждой единице перевода, включая заголовочный файл, это можно считать недостатком.
В данном конкретном случае строковых констант, похоже, что const char * является лучшим решением для всех случаев.