using directives are certainly acceptable in *.cpp files when C++ authorities like Herb Sutter and Bjarne Stroustrup explicitly say so in their published Core Guidelines:
Use using namespace directives for transition, for foundation libraries (such as std), or within a local scope (only)
However, I believe your question is based on a false premise. You say that prepending identifiers with std:: to identifiers everywhere clutters the code. This is purely subjective, and most C++ programmers I know (including myself) have the opposite view, i.e. that the std:: makes the code easier to read because standard-library components can easily be distinguished from your own classes and functions.
Now of course, this opposite opinion might be equally subjective, but you also have to consider consistency. After all, you avoid using directives at global scope in header files anyway, so why add different rules for different situations? As a C++ programmer, you are used to seeing std::string and std::vector in header files all the time, so string and vector simply look unusual, even in *.cpp files.