When should I really use noexcept?

I think it is too early to give a “best practices” answer for this as there hasn’t been enough time to use it in practice. If this was asked about throw specifiers right after they came out then the answers would be very different to now.

Having to think about whether or not I need to append noexcept after every function declaration would greatly reduce programmer productivity (and frankly, would be a pain).

Well, then use it when it’s obvious that the function will never throw.

When can I realistically expect to observe a performance improvement after using noexcept? […] Personally, I care about noexcept because of the increased freedom provided to the compiler to safely apply certain kinds of optimizations.

It seems like the biggest optimization gains are from user optimizations, not compiler ones due to the possibility of checking noexcept and overloading on it. Most compilers follow a no-penalty-if-you-don’t-throw exception handling method, so I doubt it would change much (or anything) on the machine code level of your code, although perhaps reduce the binary size by removing the handling code.

Using noexcept in the big four (constructors, assignment, not destructors as they’re already noexcept) will likely cause the best improvements as noexcept checks are ‘common’ in template code such as in std containers. For instance, std::vector won’t use your class’s move unless it’s marked noexcept (or the compiler can deduce it otherwise).

Leave a Comment