Look at it this way: C/C++ by default pass variables by value. That means functions create new variables with the names given them in the parameter lists, and copy the values in whatever variables are sent as parameters to them. At the end of execution they destroy the values. This relates historically to common computer architecture at the time C and Unix (its twin) were created. Main() is an int function because the Operating System (especially if it is Unix or GNU/Linux) wants to know if it terminated normally. Sending return 0; tells the OS the program is over and all is well.
Languages like Pascal are similar to C but have procedures. C/C++ have void functions instead (because C was created by engineers who didn't want to waste time on frills). You use a procedure, or void function, in a couple of cases. If you want to do something like output data -- print it to screen, printer or disk but not otherwise change it, then that is one reason to choose a void function. You can still return an int or bool to suggest you did it successfully or not, but it is a legitimate use for a void.
Another is when you want to alter two possibly unrelated variables. What you pass the function is either a pointer in C * or their address in C++ & and instead of copying the value in the variable it creates it copies the address of the variable which in C you have to dereference and in C++ is dereferenced for you. If the function returns something, it can't return all the values that you send it at once, so it is legitimate to use pointers and addresses, and returning anything is probably a waste of time.
That's why you would use a void function.