Почему decltype () возвращает указатель на ссылку?

Я пытаюсь получить лучшее представление о iterator_traits и нашел фрагмент кода в учебнике C ++. Поэтому я добавил некоторый код, чтобы сделать его исполняемым с целью понимания поведения указанного механизма компиляции. Полная программа выглядит так:

template<typename C>
using Iterator_type = typename C::iterator;

template<typename Iter>
using Iterator_category = typename std::iterator_traits<Iter>::iterator_category;

template<typename Ran>
void sort_helper(Ran beg, Ran end, std::random_access_iterator_tag)
{
sort(beg, end);
}

template<typename For>
void sort_helper(For beg, For end, std::forward_iterator_tag)
{
std::vector<decltype(*beg)> v {beg, end};
sort(v.begin(), v.end());
copy(v.begin(), v.end(), beg);
}

template<typename C>
void sort(C& c)
{
using Iter = Iterator_type<C>;
sort_helper(c.begin(), c.end(), Iterator_category<Iter>{});
}

void test(std::vector<std::string>& v, std::forward_list<int>& lst)
{
sort(v);
sort(lst);
}

template<typename C>
void print(C& c)
{
for(auto it = c.begin(); it != c.end(); ++it) {
std::cout << *it << '\n';
}
std::cout << '\n';
}

int main()
{
std::vector<std::string> v { "Bicycle", "Hoovercraft", "Rocket", "Airplaine", "Bus", "Submarine" };
print(v);

sort(v);
print(v);

std::forward_list<int> lst { 2, 81, 3, 0, 4, 34, 23, 11 };
print(lst);

sort(lst);
print(lst);

return 0;
}

Компиляция не может сказать, что указатель на ссылку задан:

memory:1723:16: error:
'pointer' declared as a pointer to a reference of type 'int &'
typedef _Tp*              pointer;

и стек ошибок приводит к следующей строке:

in instantiation of template class 'std::__1::vector<int &,     std::__1::allocator<int &> >'
requested here
std::vector<decltype(*beg)> v {beg, end};

эта компиляция либо на Mac OS и на Linux машина с г ++.

Мне удалось это работать, изменив вовлеченную часть следующим образом:

auto i = *beg;
std::vector<decltype(i)> v {beg, end};

Можете ли вы дать мне более четкое объяснение того, почему decltype() функция возвращает указатель на ссылку? Я прочитал несколько других вопросов, касающихся decltype Функция type в SO также прочитала спецификации, но ни привела меня на правильный путь, ни проверила полный стек выходных сообщений компилятора.

Заранее спасибо за любые соображения.

1

Решение

Проблема в том, что decltype дает ссылочный тип (вы не можете сделать std::vector из).
Почему так ответили Вот глубоко.

Вы можете исправить это одним из двух способов:

  • использование std::remove_reference<decltype(*beg)>::type
  • использование std::iterator_traits<For>::value_type
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]