Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524

Почему ссылки на указатели не являются итераторами?

30.09.2019, 16:30. Показов 2729. Ответов 26

Студворк — интернет-сервис помощи студентам
Привет))

Итератор - тип данных, предназначенный для итерирования по элементам коллекций,
и доступа к самим элементам.

Как определить: является ли тип данных итератором?
Самый простой способ, это посмотреть:
определена ли для типа категория итераторов: std::iterator_traits<it>::iterator_category
Если определена - это итератор.

В свою очередь, std::iterator_traits руководствуется требованиями
к так называемым легальным итераторам

Теперь вопрос: почему шаблон std::iterator_traits<it>::iterator_category
не определен для ссылок на указатели?

C++
1
2
using x = std::iterator_traits<int*>::iterator_category; // ok
using z = std::iterator_traits<int*&>::iterator_category; // error
Ссылка на обычный указатель на все 100%
соответствует требованием к "легальным итераторам"

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template<class t> void dtor(t v)
{
    v.~t();
}
 
int main()
{
    int v = 0;
    int* p = &v;
    int*& r1 = p;
    
    int*& r2 = p;      // CopyConstructible
    r2 = p;            // CopyAssignable
    dtor(r2);          // Destructible
    std::swap(r2, r1); // Swappable
 
    ++r2; // increment
    *r2;  // dereference
}
Ссылку на указатель можно использовать везде,
где используется обычный указатель.

Так почему же тогда ссылка на указатель не признаётся легальным итератором?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.09.2019, 16:30
Ответы с готовыми решениями:

Почему алгоритм unique_copy не правильно работает с итераторами потоков?
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;iterator&gt; #include &lt;string&gt; #include &lt;algorithm&gt; #include &lt;vector&gt; using...

Почему Лафоре использует указатели на указатели, вместо обмена значениями указателей?
Доброго времени суток! Задался теоретическим вопросом. Читал пример из книги Лафоре ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++,...

Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов?
Есть массив int **mas; mas=new int*; // выделил место под пять строк, верно ? mas=new int;// выделил для первой строки матрицы два...

26
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
01.10.2019, 15:08
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от eva2326 Посмотреть сообщение
Вы не знаете, что не так с деструктором.
В данном случае от вас просят вызвать деструктор именно для decltype(v), а не ~t()
1
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
01.10.2019, 15:15  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
В данном случае от вас просят вызвать деструктор именно для decltype(v), а не ~t()
Зачем это нужно?
Без этого итератор никак не сможет итерироваться?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
01.10.2019, 15:39
Потому что в любом из вышеприведённых листингов std::is_same<t, int*>::value == true

Добавлено через 1 минуту
А спрашиваете о int *&

Добавлено через 16 минут
В общем речь об этом:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <type_traits>
#include <iostream>
 
template<class t> void dtor(t &v)
{
    using q1 = typename std::add_lvalue_reference_t<t>;
    
    std::cout << std::is_reference_v<q1> << ' ' << std::is_same_v<q1, int*&> << ' ' << std::is_same_v<q1, decltype(v)> << '\n';
//    v.~q1(); //error: 'v' is not of type 'q1' {aka 'int*&'} 
}
 
int main()
{
    boolalpha(std::cout);
    int* p;
    int*& r2 = p;
    dtor(r2);
}
выводит true true true

Добавлено через 4 минуты
В максимально упрощённом:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <type_traits>
#include <iostream>
 
int main()
{ 
    using int_ref_t = typename std::add_lvalue_reference_t<int>;
    
    int a;
    int_ref_t ref_a = a;
    ref_a.~int_ref_t();  // 'ref_a' is not of type 'int_ref_t' :)
}
1
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
01.10.2019, 16:46  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
В общем речь об этом:
Я поняла, что вы имеете ввиду.

Перефразирую вопрос.

К итераторам есть требования.
В числе этих требований - доступность деструктора.

Вот с чем связанно это требование?

Он что, без деструктора итерироваться не сможет?
Или в чем проблема?
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
01.10.2019, 16:51
Цитата Сообщение от eva2326 Посмотреть сообщение
Он что, без деструктора итерироваться не сможет?
наверно он без деструктора не будет считаться объектом полноценным, или типа того

Добавлено через 49 секунд
может быть тут замешаны принципы ООП и все такое ...
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
01.10.2019, 17:02
Цитата Сообщение от _stanislav Посмотреть сообщение
наверно он без деструктора не будет считаться объектом полноценным, или типа того
Та потому, что кроме итерирования к итераторам есть еще и другие требования, но это не имеет значения т.к. ссылка не объект, а сами итераторы это обертки над указателями в первую очередь)
Цитата Сообщение от _stanislav Посмотреть сообщение
может быть тут замешаны принципы ООП и все такое ...
Ясно что нет
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
01.10.2019, 17:06
Цитата Сообщение от Azazel-San Посмотреть сообщение
Ясно что нет
даже косвенно? или даже косвенно-косвенно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.10.2019, 17:06

Почему declarations в C не являются statements, а в C++ являются
Сабж. Очень мучает этот вопрос. Определенно есть какие-то концептуальные изменения в поведении компилятора, но я нигде не нашел информации...

Ссылки и указатели
Добрый день. Возможно было. В чем существенная разница между передачей данных в функцию по ссылке или указателю. В каких случаях вы бы...

Ссылки и указатели
Всем привет. Совсем запутался с ссылками и указателями. Помогите решать задачку: Функция принимает два аргумента, число с плавающей...

Указатели и Ссылки
извеняюсь,но никак не могу понять. int sum(int* inLeft, int* inRight) { if(inLeft == inRight) return *inLeft; ...

Ссылки и указатели
Добрый день, не могу понять чем помогают при использовании указатели и ссылки? Есть код на c++ #progma once class well { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
BitTorrent (версия 4.3.9) и Меню Настройки
russiannick 15.11.2026
В меню Настройки можно отключить автоматическое обновление программы. Карта этого меню приложена ниже. Нужный пункт выделен красным. Сервис Настройки Поведение
Транслитерация текста с кириллицы на латиницу (вариант №3)
Maks 15.11.2026
Обновленная версия предыдущей обработки. Изменения коснулись букв: Ъ, Ы, Ь, Э, отображения которых зависят от положения реквизита "Транслитерация имён". Изменено отображение буквы Й. Добавлена. . .
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru