When we designed this rule, its goal was to promote the use of auto, based on the famous Almost Always Auto article by Herb Sutter, but only focusing on cases which we think at non-controversial (which also explains the title of the rule).
So we considered that:
auto foo = std::string("foo");
Is, without much controversy, better than:
const std::string foo = std::string("foo");
We don’t say that const std::string foo("foo"); is bad (although I personally prefer the auto foo = ... style).
The reason why we propose rewriting it with auto is that this style also works nicely with other cases detected by this rule, while there is no way to avoid repeating the type without using auto for those other cases:
std::string *foo = new std::string{bar};
// =>
auto foo = new std::string{bar};
One could want adress the first point, without the second one. I’ll favorize here the “separation of concerns”.
In the sample code I gave, auto is in no way better than :
const std::string foo("foo");
If I change of type, I’ll have to rewrite anyway my instruction.
Personnally, I dislike/avoid the static initialization with the = sign.
You could change the rule title to “Avoid repetition of types”, and for the discussed case, suggest auto or the old way to do initialization (without =).