Em libstdc++ há o seguinte código:
class common_iterator
{
...
[[nodiscard]]
constexpr decltype(auto)
operator*()
{
__glibcxx_assert(_M_index == 0);
return *_M_it;
}
[[nodiscard]]
constexpr decltype(auto)
operator*() const requires __detail::__dereferenceable<const _It>
{
__glibcxx_assert(_M_index == 0);
return *_M_it;
}
...
}
Estou tentando entender por que não temos apenas um operator*() const
membro. Quando tenho uma referência const para um iterador (não const_iterator), acho que é natural permitir a desreferência, mas esta fonte sugere que às vezes não consigo desreferenciar tais referências const.
Por que e em quais casos faz sentido proibir a desreferenciação?