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: [2011]
Note that there's also a later paper by Nico Josuttis [2018]:
I don't think any differences are relevant to your question, but just FYI.
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.
Can you clarify what you mean? Looking at cppreference,
I see that
(1) std::cbegin in fact has a narrow contract; it simply delegates to std::begin(x), which is allowed to throw.
(2) std::cbegin is marked conditionally noexcept.
So, I'm not sure what you're asking.
–Arthur