Форум программистов, компьютерный форум CyberForum.ru

Шаблон с "универсальной ссылкой" (C++11) - C++

Восстановить пароль Регистрация
 
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
14.09.2013, 13:57     Шаблон с "универсальной ссылкой" (C++11) #1
Есть такой код, который не компилируется:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <vector>
 
template<typename T>
void foo(T&& t)
{
   t[0] = 1000;
   std::cout << t[0] << std::endl;
}
 
void h(std::vector<int>& v)
{
   foo(v);
}
 
void g(const std::vector<int>& v)
{
   foo(v);
}
 
int main()
{
   std::vector<int> v {1,2,3,4};
   foo(v);
   h(v);
 
   return 0;
}
Если закоментировать функцию g, то код скомпилируется. Компилятор mingw 4.8.1. Как это объяснить?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.09.2013, 13:57     Шаблон с "универсальной ссылкой" (C++11)
Посмотрите здесь:

Ошибка в программе, где создается шаблон класса "стек" C++
C++ Написать шаблон для класса "Рабочий"
C++ Создать класс комплексных чисел и ввести операции: "+", "-", "*", "/".
Чтения структуры из файла (описать структуру с именем "ORDER": "счет плательщика"; "счет получателя"; "сумма, переводится банковской операцией") C++
C++ Шаблон двусвязного списка и ошибка "Члены недоступны"
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,920
Записей в блоге: 2
Завершенные тесты: 1
14.09.2013, 14:04     Шаблон с "универсальной ссылкой" (C++11) #2
Хреновый вариант, но, думаю, он покажет одну из проблем:
C++
1
2
3
4
void g(const std::vector<int>& v)
{
   foo( const_cast<std::vector<int>&> (v) );
}
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
14.09.2013, 14:10     Шаблон с "универсальной ссылкой" (C++11) #3
касты конечно можно замутить попробовать, но это ведь нехорошо.
суть в том, что в g попытка вызвать функцию, которая принимает неконстантную ссылку. а аргумент - константная ссылка.
уж лучше так:
foo(std::vector<int>(v));
так корректнее, только не факт, что это нужно было автору.
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,284
14.09.2013, 14:12     Шаблон с "универсальной ссылкой" (C++11) #4
А что именно нуждается в объяснении? Все вроде достаточно очевидно
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
14.09.2013, 14:16  [ТС]     Шаблон с "универсальной ссылкой" (C++11) #5
Я же функцией g вообще не пользуюсь. Без нее код запускается:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <vector>
 
template<typename T>
void foo(T&& t)
{
   t[0] = 1000;
   std::cout << t[0] << std::endl;
}
 
void h(std::vector<int>& v)
{
   foo(v);
}
 
int main()
{
   std::vector<int> v {1,2,3,4};
   h(v);
 
   return 0;
}
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,284
14.09.2013, 14:18     Шаблон с "универсальной ссылкой" (C++11) #6
Как там было-то: "А вы его не чешите, он и не будет беспокоить"
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
14.09.2013, 14:19     Шаблон с "универсальной ссылкой" (C++11) #7
Скорее всего, в функции g(), нужно делать такой вызов: foo(std::move(v));
может тогда компилятор схавает и преобразует T в T&&
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
14.09.2013, 14:21     Шаблон с "универсальной ссылкой" (C++11) #8
Цитата Сообщение от DiffEreD Посмотреть сообщение
Я же функцией g вообще не пользуюсь
то что ты её не используешь не значит что компилятор её "выкидывает"
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
14.09.2013, 14:21     Шаблон с "универсальной ссылкой" (C++11) #9
Хотя нет, так не работает, только что проверил...
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
14.09.2013, 14:31  [ТС]     Шаблон с "универсальной ссылкой" (C++11) #10
Цитата Сообщение от Jupiter Посмотреть сообщение
то что ты её не используешь не значит что компилятор её "выкидывает"
Ну и какое она может имеет отношение к вызову другой, никак с ней несвязанной функции h?
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
14.09.2013, 14:44     Шаблон с "универсальной ссылкой" (C++11) #11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <vector>
 
template<typename T>
void foo(T t)
{
   t[0] = 1000;
   std::cout << t[0] << std::endl;
}
 
void h(std::vector<int>& v)
{
   foo(v);
}
 
void g(const std::vector<int>& v)
{
   foo(v);
}
 
int main()
{
   std::vector<int> v {1,2,3,4};
   foo(v);
   h(v);
 
   return 0;
}
а вот так работает. Зачем вам вообще rvalue ref там, где она не нужна? Да и вообще сотрите эту функцию g(), если не используете
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
14.09.2013, 14:44     Шаблон с "универсальной ссылкой" (C++11) #12
Цитата Сообщение от DiffEreD Посмотреть сообщение
Ну и какое она может имеет отношение к вызову другой, никак с ней несвязанной функции h?
функция g никакого отношения к функции h не имеет.
транслятор проводит лексический, синтаксический, семантический анализ всего кода, в том числе и функции g, независимо от того вызывается эта функция или нет.

если бы функция g была шаблонной, то да компилятор мог бы и не проводить детальный анализ пока бы не увидел инстанциирование шаблона, MSVS так и поступает.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,920
Записей в блоге: 2
Завершенные тесты: 1
14.09.2013, 14:46     Шаблон с "универсальной ссылкой" (C++11) #13
Цитата Сообщение от gromo Посмотреть сообщение
Зачем вам вообще rvalue ref там, где она не нужна? Да и вообще сотрите эту функцию g(), если не используете
тогда уж
C++
1
2
3
int main ( ) {
   std :: cout << "1000\n1000" << std :: endl ;
}
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
14.09.2013, 19:15     Шаблон с "универсальной ссылкой" (C++11) #14
rvalue reference cannot bind to a const lvalue reference.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.09.2013, 19:55     Шаблон с "универсальной ссылкой" (C++11)
Еще ссылки по теме:

C++ Дружественная функция шаблон и ошибка "Ссылка на неразрешенный внешний символ"
C++ Вставить пробел после каждого символа "." "," "!" или "?", если за этими символами не следует пробел
C++ Шаблон класса "Стек" на основе массива

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

Или воспользуйтесь поиском по форуму:
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
14.09.2013, 19:55     Шаблон с "универсальной ссылкой" (C++11) #15
Цитата Сообщение от Герц Посмотреть сообщение
rvalue reference cannot bind to a const lvalue reference.
В точку.
Yandex
Объявления
14.09.2013, 19:55     Шаблон с "универсальной ссылкой" (C++11)
Ответ Создать тему
Опции темы

Текущее время: 12:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru