Lorsque vous utilisez /EHsc, le compilateur n'émet du code pour les filtres d'exception que lorsqu'il peut détecter que le code enveloppé dans le bloc try {} est susceptible de lever une exception C++. Un filtre d'exception garantit que le destructeur de tout objet C++ local est appelé lorsque la pile est déroulée pendant le traitement d'une exception. Il permet au RAII de fonctionner.
Il s'agit d'une optimisation, de l'espace et du temps pour le code x86, de l'espace pour le code x64. L'espace parce qu'il peut omettre le code de filtrage des exceptions, qui est modeste d'ailleurs. Le temps parce que sur x86 il peut éviter d'enregistrer le filtre d'exception en entrant dans le bloc try {}. Très modeste aussi. x64 utilise une méthode différente pour trouver les filtres d'exception, basée sur des tables.
La phrase clé du premier paragraphe est "pourrait lever une exception C++". Sous Windows, il existe d'autres sources d'exceptions. Comme le "a" dans /EHa, les exceptions asynchrones qui sont levées par le matériel. Des choses comme les exceptions relatives à la virgule flottante, la division par zéro et la toute puissante exception de violation d'accès. Mais aussi notamment le type d'exceptions qui sont levées par le code avec lequel vous pourriez interopérer. Comme le code géré, en gros tout ce qui s'exécute dans une VM.
Si vous souhaitez que vos objets soient également protégés contre ce type d'exceptions, vous devez utiliser /EHa, qui indique au compilateur de siempre enregistrer le filtre d'exception.
Attention à un effet secondaire désagréable de /EHa, il fait avaler catch(...) todos exceptions. Y compris celles que vous ne devriez jamais attraper, comme AV et SO. Regardez __try/__except
et _set_se_translator() si c'est important pour vous.