I need to go so far as to say that this is a bad form for non-PODs, especially if you work in a team primarily because of problems with the initialization order, which can easily arise because of this.
// the following invokes undefined behavior. static bool success=cout<<"hello world\n";
Usually people do not write code as described above, but consider whether success was initialized by the return value of another function. Now, any temptation to use cout or cerr or any other global object in this function has caused the same undefined behavior.
For custom types with constructors and destructors, consider an alternative method in which initializing access:
static Foo& safe_static() { static Foo f; return f; }
Unfortunately, this also has thread safety issues, so some kind of blocking mechanism is needed to build "f" if you are accessing safe_static at the same time.
Nevertheless, I think that we should try to make everything simple. Unfortunately, when it comes to user-defined objects defined in the file area, it's too easy to run into undefined behavior. The little extra effort needed to write something like safe_static above can prevent a lot of headaches.
Exceptions are another point. If your static objects are thrown from your constructor, then you have no way to catch an exception. If you want your application to be really reliable and even handle errors on startup, you need to carefully structure your code (for example: have try / catch blocks in the constructors for objects created in the file area so that the exception is not thrown outside of ctor, and also avoid initializer lists that drop).
If you work as a team, you might think of yourself: "Oh, I do not get access to any other global groups in my class, I could also make it simple global with internal communication in the file area." Then this may be true, but before you find out, your employee adds another global variable and tries to access it from the constructor of your class. Suddenly, you have undefined behavior that might not even appear as a problem on the main platform that you are aiming for, just so that your code crashes and does other strange things when you try to move your code to another place.
This is really not worth the potential IMO headaches, and this is a problem that is much easier to avoid than fix.