TL;DR
Учитывая следующий тип:
struct A
{
std::vector<std::string> vec;
using reference = std::iterator_traits<decltype(vec)::iterator>::reference;
using const_reference = const reference;
};
Почему reference == const_reference
? Почему квалификатор const
опущен во втором псевдониме типа?
См. пример на godbold, который не должен компилироваться.
Подробности
У меня есть шаблонный класс, который принимает кучу итераторов (типов) в качестве аргументов шаблона. Из этих итераторов мне нужно вывести ссылочный и константный ссылочный тип, потому что у меня есть некоторые функции-члены, такие как:
struct A
{
std::vector<std::string> vec;
using reference = std::iterator_traits<decltype(vec)::iterator>::reference;
using const_reference = const reference;
const_reference foo() const
{
return vec[0];
}
};
Отбрасывая квалификатор const
, я фактически возвращаю ссылку в foo
, что является недопустимым, поскольку это константная функция-член, поэтому компилятор выдает исключение.
reference
этоstring&
.const reference
на самом делеstring& const
- person Passer By   schedule 22.05.2018iterator_traits
не имеет типаconst_reference
. - person Timo   schedule 22.05.2018