Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484

Дедукция параметров шаблона

26.05.2020, 20:01. Показов 2239. Ответов 43
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Читаю книгу, цитата с нее Когда сам параметр функции является константой, выведенный для параметра Т тип не будет константным типом.
и позже идет вот такой пример
C++
1
2
3
4
5
6
7
template <typename Т> string debug_rep(const T &t) 
{
 //code
}
 
const string *sp = &s; 
cout << debug_rep(sp) << endl
циатата

debug_rep (const string*&) — экземпляр первой версии шаблона с привязкой параметра Т к типу const string*;

почему Т const string *, а не string*?


P.S. и что такое *& ? Как это понимать?

Добавлено через 1 час 59 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <string>
 
template<typename T>
void f(const T & obj){
}
 
 
int main(){
    std::string str;
    const std::string *sp = &str; 
    f(sp);
    system("pause");
    return 0;
}
Почему при передаче указателя с const верхнего уровня сохраняется этот const? И почему вообще параметр функции ссылка , но каким-то образом она принимает указатель?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.05.2020, 20:01
Ответы с готовыми решениями:

Переменное число параметров шаблона
Здоровеньки булы. Не уверен, что название темы точно отражает суть вопроса. Есть заготовка шаблонного делегата, параметры которого -...

Перехват значений параметров шаблона
Вопрос, собственно, в развитие этой темы - https://www.cyberforum.ru/cpp-beginners/thread930128.html Есть вот такой код: namespace...

Не могу понять объявление параметров шаблона
привет template &lt;typename T, T* Root, template&lt;T*&gt; class Buf&gt; class Structure; я не могу расшифровать 3ий параметр шаблона,...

43
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
26.05.2020, 21:45
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от ReYalp Посмотреть сообщение
почему это превращается в
Это псевдокод.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
26.05.2020, 21:53  [ТС]
DrOffset, почему Вы называете
Цитата Сообщение от ReYalp Посмотреть сообщение
const T &t
верхним уровнем? если здесь const стоит перед типом , а это const нижнего уровня

Добавлено через 1 минуту
и при том что const в ссылках всегда нижнего уровня
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
26.05.2020, 21:57
ReYalp,
Чтобы записать константный указатель, как вы делаете?
C++
1
T * const p; // 1
Да?
Если вы напишете
C++
1
const T * // 2
то что это будет? Указатель на константу, да? Сам указатель - неконстантный.
Такой у С\С++ синтаксис.
Если вы при подстановке в
C++
1
const T // 3
вместо T подcтавите const string *,
то что у вас получится? Наверное
C++
1
const const string * // 4
да?
К чему тут теперь что относится?
Если бы в С++ можно было ставить скобки, как в моем псевдокоде, то
можно было бы яснее написать
C++
1
const (const string *) // 5
Но такие скобки ставить нельзя, поэтому смотрим на первый const (до скобок у нас), он относится к тому, что в скобках, т.е. вляет на константность самого указателя. Смотрим на (1), получаем
C++
1
const string * const
Добавлено через 48 секунд
Цитата Сообщение от ReYalp Посмотреть сообщение
почему Вы называете верхним уровнем?
Потому что он верхний для того, что в T находится.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
26.05.2020, 22:00  [ТС]
DrOffset, тоесть const const type * всегда даст const type * const?

Добавлено через 1 минуту
DrOffset, но как он верхний если он нижний же, верхним он стает,получается, только если туда указатель передать, если не передавать он нижним будет
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
26.05.2020, 22:01
ReYalp, если бы так можно было писать вообще, то да. Это псевдокод, еще раз. Просто чтобы вы прмиерно понимали где какие квалификаторы появляются и на что влияют.

Добавлено через 1 минуту
Цитата Сообщение от ReYalp Посмотреть сообщение
но как он верхний если он нижний же, верхним он стает,получается, только если туда указатель передать, если не передавать он нижним будет
Но вы спрашиваете именно про ситуацию, когда передается указатель с конст нижнего уровня.
Я вам в ее контексте и отвечаю.
Ссылка тут не играет вообще роли, чтобы разбираться в ситуации она не нужна.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
26.05.2020, 22:04  [ТС]
DrOffset, так получается он стает верхним только потому что я передаю указатель?
Цитата Сообщение от DrOffset Посмотреть сообщение
Но вы спрашиваете именно про ситуацию, когда передается указатель с конст нижнего уровня.
Я вам в ее контексте и отвечаю.
Ссылка тут не играет вообще роли, чтобы разбираться в ситуации она не нужна.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
26.05.2020, 22:06
ReYalp, и мне в четыре раза сильнее непонятны ваши вопросы, после того, как вы плюсанули ответ TheCalligrapher, который написал о том же самом

Добавлено через 1 минуту
Цитата Сообщение от ReYalp Посмотреть сообщение
так получается он стает верхним только потому что я передаю указатель?
Он всегда верхний по отношению к T.

По отношению к всему параметру, вместо со ссылкой - это конст нижнего уровня, но это в данном контексте вообще не предмет разговора. Ибо у ссылки семантика того объекта, на который она ссылается.
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
26.05.2020, 22:07  [ТС]
DrOffset, а если юрать не ссылки с указателями , const в таком случае допустимо называть верхним? или он просто const ?
C++
1
const int a = 5;
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
26.05.2020, 22:12
ReYalp, тут он всегда верхний. Поэтому слово "верхний" можно и не говорить.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
26.05.2020, 22:38
Цитата Сообщение от ReYalp Посмотреть сообщение
template <typename Т> string debug_rep(const T &t)
что бы ты ни засунул в этот шаблон,
ты получишь ссылку на неизменяемый объект.
ну или: ссылку на неизменяемое T.

весь фокус в том, что const T - неизменяемое T.
и если T - это указатель, тогда const T - это неизменяемый указатель.
а для неизменяемых указателей const пишется справа, после звездочки.


int ==> const int&
т.к T = int, значит const T = const int.

const int ==> const int&
т.к T = const int, значит const T = const const int,
двойной const схлопывается до одинарного.

int* ==> int* const&
т.к T = int*, значит const T = int* const (обрати внимание: const справа от звездочки)

int* const ==> int* const&
т.к T = int* const , значит const T = int* const const (обрати внимание: const справа от звездочки)
двойной const схлопывается до одинарного.

const int* ==> const int* const&
т.к T = const int* , значит const T = const int* const

const int* const ==> const int* const&
т.к T = const int* const, значит const T = const int* const const (обрати внимание: const справа от звездочки)
двойной const схлопывается до одинарного.
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
27.05.2020, 00:48  [ТС]
DrOffset, а еще вот такой случай.
Есть вот этот шаблон функции
C++
1
2
3
4
template <typename F, typename T1, typename T2> void flip2(F f, T1 &&t1, T2 &&t2)
{
f(t2, t1) ;
}
и есть такая вот функция
C++
1
void g (int &&i, int& j) { cout << i << " " << j « endl; }
C++
1
2
int j = 123;
flip2(g,j,42);
почему ошибка при вызове функции g(t2,t1); В функцию flip2 передается rvalue 42 , в каком месте оно становится lvalue? ЗДесь же нет свертывания ссылок , или есть(именно в случае с T2&& t2, в случае с T1 &&t1 там есть оно)?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,407
27.05.2020, 00:55
Цитата Сообщение от ReYalp Посмотреть сообщение
В функцию flip2 передается rvalue 42 , в каком месте оно становится lvalue?
t1 и t2 внутри функции flip2 - это lvalue. Именованная ссылка любого типа - это всегда lvalue.

Цитата Сообщение от ReYalp Посмотреть сообщение
ЗДесь же нет свертывания ссылок
Во-первых, свертывание ссылок тут, разумеется, есть. t1 и t2 - "универсальные ссылки", которые работают именно через свертывание.

Во-вторых, какая разница вообще, есть тут свертывание ссылок или нет? Еще раз: любая именованная ссылка - это lvalue.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
27.05.2020, 01:05  [ТС]
TheCalligrapher, Тоесть revalue ссылка это lvalue ссылка?

Добавлено через 5 минут
Или сама ссылка это lvalue?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.05.2020, 01:55
Цитата Сообщение от ReYalp Посмотреть сообщение
Тоесть revalue ссылка это lvalue ссылка?
rvalue/lvalue - это свойство выражений (не типов)

rvalue - это выражение, в контексте которого осуществляется доступ к безымянному объекту.
безымянные объекты: это либо временные объекты.
либо обычные, но в контексте выражения у них нет имени.

не важно какая у тебя там ссылка.
если у ссылки есть имя - значит уже не безымянная,
значит уже не может быть rvalue


рассмотрим пример:

C++
1
2
3
4
5
6
7
8
foo(int&& rval){}
 
int main()
{
    int val = 0;
    int&& rval = std::move(val);
    foo(rval); // <--- error ожидается rvalue
}
казалось бы: как же так? rval имеет тип int&&
функция foo принимает int&&
так в чем же дело?

дело в том, что rvalue - это либо prvalue
(временный объект, у которых как известно нет имени),
либо xvalue: обычный объект, но его лишили имени
при помощи вспомогательной функции (std::move)

именованный объект - всегда lvalue, просто потому что у него есть имя.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.05.2020, 02:13
del пока писал всё уже написали)
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
27.05.2020, 10:07  [ТС]
hoggy, Тоесть любые параметры любых функций это всегда lvalue?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.05.2020, 10:31
Цитата Сообщение от ReYalp Посмотреть сообщение
Тоесть любые параметры любых функций это всегда lvalue?
ога.

без дополнительных телодвижений - lvalue

вот этот код написал балбес:

C++
1
2
3
4
5
template<class ...Args>
void foo(Args&&... args)
{
    bar(args...); // <--- похерил все rvalue
}
чоткие поцаны пишут:

C++
1
2
3
4
5
template<class ...Args>
void foo(Args&&... args)
{
    bar(std::forward<Args>(args)...); // <--- вертаем все rvalue в зад
}
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
27.05.2020, 10:48  [ТС]
hoggy, и ещё одно, в примере выше там где параметр функции это. ссылка на rvalue (прошлый Ваш пример), если туда передать аргументом rvalue то выходит что. rvalue становится lvalue?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.05.2020, 10:59
Цитата Сообщение от ReYalp Посмотреть сообщение
выходит что. rvalue становится lvalue?
ога.

параметр функции имеет имя.
и пока в выражении фигурирует это имя, он будет lvalue

C++
1
2
3
4
5
6
foo(int&& rval)
{
    // rval is lvalue
 
    bar( std::move(rval) ) // <--- move на самом деле просто убирает имя
}
в контексте вызова функции bar, в неё запихали безымянный объект .
если же запихивать именованный объект: bar(rval) будет lvalue
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
27.05.2020, 11:36  [ТС]
hoggy, а функция как-то может вернуть именно lvalue? Насколько я понимаю то никак

Добавлено через 28 минут
hoggy, ну просто функция возвращающся ссылку на lvalue не дает имя этой ссылке, соответственно если нету имени нету lvalue, или я что-то не тка понял)
C++
1
2
3
4
5
6
7
8
9
10
11
12
using namespace std;
 
int a = 5;
 
int& func(){
        return a;
    }
 
int main(){
    func() = 25;  //func() - lvalue
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.05.2020, 11:36

Пользовательский deduction guides – для вывода типов параметров шаблона
Здравствуйте уважаемые форумчане. Есть такое задание и с ним я встал в тупик. Необходимо создать шаблон класса, который содержит...

Выбор кода для компиляции на основании сравнения параметров шаблона
Здравствуйте. Помогите, пожалуйста, разобраться со следующим вопросом. Необходимо выбирать компилируемый код в зависимости от какого-либо...

Gtest, доступ к элементам базового класса-шаблона без указания параметров шаблона. баг или фича?
Всем привет. Продолжаю экспертизу gtest/gmock. Количество ошибок и багов зашкаливает. Ничего удивительного, учитывая то, ...

Изменить значения параметров шаблона товара
Здравствуйте! подскажите, как изменить в шаблоне содержимое , например, значения поля keywords

Для использование шаблона переменной требуется список аргументов шаблона
Здравствуйте! Не могу понять в чём проблема. //ALL2.cpp #include &quot;pch.h&quot; #include &lt;iostream&gt; #include &lt;Windows.h&gt; ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. https:/ / youtu. be/ VpfFZSUDGnQ. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru