Quite often, the user of your program is only interested in the results, because they are printed in stdout, for example, if you use the cat unix command, for example:
$ cat file.txt
The contents of file.txt are expected to appear on a standard disk. However, if something happens during the execution of the cat (strictly theoretically, nothing occurred to me), you expect it to go to stderr, so as a user, you can still separate the two, for example
$ cat file.txt 1>result.txt 2>stderr.txt
Suppose I want to collect the contents of several files, I do the following
$ cat *.java 1>all_files_conent.java 2>errors.txt
If any of the files is unavailable (for example, due to permissions), the errors.txt file will have the corresponding message:
cat: Controller.java: Permission denied
But the contents of all_files_content.java is as correct as it can be.
Therefore, if the message is the actual product of your program, you should use cout, if it is just a status message, use cerr. Of course, all this does not matter if what goes to the console is just a by-product. However, you can still allow the user to separate the two, as in the example above.