Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Undisputed
194 / 125 / 32
Регистрация: 10.06.2014
Сообщений: 1,546
Завершенные тесты: 3
#1

Ссылка как параметр шаблона. Что это значит? - C++

22.01.2017, 19:19. Просмотров 134. Ответов 2
Метки нет (Все метки)

Увидел в данной теме http://www.cyberforum.ru/cpp-beginners/thread1900008.html что шаблонный тип можно указать как ссылку. Судя по тесту если шаблонный аргумент указать как ссылочный, тогда T преобразуется в T&.
http://rextester.com/ZUOS1692
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
template<typename T>
class Test
{
    public:
        int n;
        void method(T ref)
        {
            ++ref;
        }
};
 
int main()
{
    int num = 100;
    Test<int&> n;//T преобразовалось в T&
    n.method(num);
    std::cout << num;
}

Вот я подумал, если в метод void method(T ref) объявить как void method(T& ref) и шаблонный аргумент сделать ссылкой, то учитывая то, что ссылочный шаблонный аргумент преобразуется в T&, а аргумент метода объявлен как T&, тогда должна получится rvalue ссылка. Но этого не происходит. Почему?
http://rextester.com/TFL46789
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
template<typename T>
class Test
{
    public:
        int n;
        void method(T& ref)
        {
            ++ref;
        }
};
 
int main()
{
    Test<int&> n;//T как в прошлом примере должно преобразоваться в T&. Один амперсанд из шаблона а другой из метода == &&. Т.е T&&
    n.method(53254);//но метод не вызывается с rvalue значением, вместо этого получаем ошибку компиляции
}

И ещё не понятно что произойдет, если аргумент T указан в методе как T&& и при этом аргумент шаблона будет ссылкой. В итоге получается T&&& что ли?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.01.2017, 19:19
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Ссылка как параметр шаблона. Что это значит? (C++):

что значит !a и a%=(c+10) и как это записать?
что значит !a и a%=(c+10) и как это записать? заранее благодарен...

Что это значит?
Скажите, пожалуйста, что значит эта строка?

что это значит?
в задании есть такой фрагмент if(!(num%div)) что это означает?

a=*b Что это значит?
Подскажите пожалуйста!

что это значит?
Помогите, пожалуйста, разобраться в данном фрагменте программы) char*...

Что это значит?
Что значит условие (!a)?В каком случае будет выполняться правда? if(!a) {...

2
hoggy
Заблокирован
22.01.2017, 19:23 #2
для шаблонно-аргументов и auto действуют правила схлопывания ссылок.
https://habrahabr.ru/post/242639/
1
Undisputed
194 / 125 / 32
Регистрация: 10.06.2014
Сообщений: 1,546
Завершенные тесты: 3
22.01.2017, 19:28  [ТС] #3
hoggy,
<T&> и method(T) == &
<T&> и method(T&) == &
<T&> и method(T&&) ==&
<T&&> и method(T&&) ==&&
т.е если шаблонный аргумент ссылка - результатом всегда будет обычная ссылка. верно?
только если аргумент шаблона rvalue ссылка, и метод тоже принимает rvalue ссылку - тогда rvalue
либо если в методе не указана ссылка а аргумент шаблона rvalue, то результатом будет rvalue
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.01.2017, 19:28
Привет! Вот еще темы с решениями:

Что это значит if (x&1) ?
основным вопросом есть if (x&amp;1) что это за условия? и что это? x&gt;&gt;1. какая...

Что значит это условие
Вот собственно код: if ( ( words = (char**)realloc(words, sizeof(char*) * (cnt...

Что значит это строка кода?
int _tmain(int argc, _TCHAR* argv) Объясните пожалуйста что значит этот...

Не могу понять, что это значит: while(i<10/2)
/*обращение массива*/ #include &lt;stdio.h&gt; main() { int p,i=0; static...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru