From C ++ 11, 15.3 / 15 standard:
The exception that is currently thrown is discarded if the control reaches the end of the handler of the try-block function of the constructor or destructor.
The reasons are explained in the GOTW Jerry links for your question, but in short: imagine, if it had not been repeated, then the following lines after S s; presumably they will try to use s , despite the fact that he never completed the construction, and when s leaves the scope, the constructor will organize a call to the destructor for s - potentially freeing never-initialized pointers, freeing never-executed locks, etc.
In contrast, if you allow the default data item to be initialized, and then assign it from the try / catch block in the constructor body, the state of an object that includes databases and data items can potentially be saved in some coherent state: for you, how It is up to the programmer to decide whether this state will be normal - that is, whether you will use the try / catch block inside the constructor body and have later member functions to handle the potentially constructed default data element.
source share