I have noticed that some standard functions having a wide contract such as functions in [iterator.range] conditionally do not throw exceptions, but they are not marked as conditionally noexcept.


It is described in N3279:

Each library function having a wide contract, that the LWG agree cannot throw, should be marked as unconditionally noexcept.

If a library swap function, move-constructor, or move-assignment operator is conditionally-wide (i.e. can be proven to not throw by applying the noexcept operator) then it should be marked as conditionally noexcept. No other function should use a conditional noexcept specification.

But there are some functions that do not obey this guideline such as std::cbegin. And I did not find a reason in this paper.