I'm still new to the C++ programming language, and I'm trying to learn new things.
I'm implementing a very very basic iterator/reverse_iterator classes and other standard library containers.
I see in most standard library implementations like GCC, MS, and others that they use the noexcept specifier and noexcept operator in the majority of their functions to test if they throw or not.
This is one example:
_GLIBCXX17_CONSTEXPR
reverse_iterator(const reverse_iterator<_Iter>& __x)
_GLIBCXX_NOEXCEPT_IF(noexcept(_Iterator(__x.current)))
: current(__x.current)
{ }
_GLIBCXX_NODISCARD
_GLIBCXX17_CONSTEXPR iterator_type
base() const
_GLIBCXX_NOEXCEPT_IF(noexcept(_Iterator(current)))
{ return current; }
But, there are parts where they don't use them, like this:
template<typename _Iterator>
_GLIBCXX_NODISCARD
inline _GLIBCXX17_CONSTEXPR bool
operator==(const reverse_iterator<_Iterator>& __x,
const reverse_iterator<_Iterator>& __y)
{ return __x.base() == __y.base(); }
I know that if a function is marked as noexcept, the compiler can perform some optimizations, and also know that only needs to be used where you know the function (or calls to other functions inside) cannot throw exceptions.
As until I understand, here is used because we're working with templates, and we're testing if the type does or doesn't throw (please correct me if I'm wrong).
So, in what situations do I need to test for no-throwing with noexcept specifier and noexcept operator in functions?
And, from the example above with the comparison operator, why don't they use noexcept?
Can I mark those comparison operators noexcept or test if they are noexcept?
I did some research on several websites and found great information that expanded my knowledge in the
noexceptusage.After reading the Andrzej's C++ blog. Using noexcept I understood how does
noexceptwork better and when to use it and when to avoid it.From the examples that I introduced in my question, I wanted to know why, in this particular case, the
operator==is not usingnoexceptif is well known that mark a function/constructor asnoexceptthe compiler can perform some optimization and I ended with the conclusion that there is no performance gain if I use it in that particular function.In other words, the
operator==don't need thenoexceptspecification because no performance gain is used for the code itself because there are no move-like operations involved or other kind of no-throw exceptions guarantees that are needed. And finally, theoperator==is marked asinline constexprthat is going to inline the function where used, so that is a performance gain for that particular code.