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

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

30.09.2019, 16:30. Показов 2645. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru