Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 49, средняя оценка - 4.61
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
#1

Лямбда не допускает auto - C++

04.06.2013, 11:56. Просмотров 6065. Ответов 7
Метки нет (Все метки)

Всем привет!

Имеем код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
 
int main() 
{
    std::vector<int> v(10);
    std::iota( v.begin(), v.end(), 1 );
    std::for_each( v.begin(), v.end(), [](long long i){ std::cout << i << " ";}); // ok
    //std::for_each( v.begin(), v.end(), [](int i){ std::cout << i << " ";}); // ok
    //std::for_each( v.begin(), v.end(), [](double i){ std::cout << i << " ";}); // ok
    //std::for_each( v.begin(), v.end(), [](auto i){ std::cout << i << " ";}); // error 
 
    return 0;
}
Почему в данном случае в параметрах лямбда-функции не допускается использование auto?
Ведь компилятор имеет возможность вывести тип элементов контейнера.
И, более того, код с диапазонным for работает:

C++
1
2
3
4
for( auto e : v )
{
    std::cout << e << " ";
}
1
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.06.2013, 11:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Лямбда не допускает auto (C++):

Лямбда функции - C++
Помогите пожалуйста. Написать программу демонстрирующую лямбда функцию на с++. желательно с комментариями, а то я в этом совсем ничего не...

Ошибка parameter declared 'auto' - C++
Код: #include &lt;algorithm&gt; #include &lt;iostream&gt; #include &lt;set&gt; #include &lt;vector&gt; ...

Функторы, предикаты, функциональные адаптеры, лямбда-функции - C++
Вступление Статья ориентирована на программистов С++, поверхностно знающих/желающих узнать STL, в особенности, с использованием его...

Анонимные функции или лямбда-выражения - C++ Builder
Приветствую всех. Решил разобраться с анонимными функциями или, как их называют, лямбда-выражениями. Благо компилятор в лице RAD Studio XE...

Поддерживает ли Embarcadero® C++Builder 10 Seattle лямбда выражения? - C++ Builder
Есть код std::vector&lt;TSearchRec&gt; LogFileList(1); TSearchRec Record; if(FindFirst(&quot;Log*.*&quot;,faAnyFile,Record)==0) { ...

Некорректно работают функции Auto-Tone, Auto contrast, Auto color - Photoshop
Не корректно работают функции Auto-Tone, Auto contrast, Auto color. Вот пример (как на картинке). То есть оно какбы что-то делает и,...

7
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,356
Записей в блоге: 2
Завершенные тесты: 1
04.06.2013, 18:23 #2
Дык в таком виде тоже не работает
C++
1
2
3
4
5
6
7
8
9
10
11
int func (auto a)
{
    return 0;
}
 
int main()
{
    std::cout << func(1) << std::endl;
 
    return 0;
}
хотя пример не совсем эквивалентный.
Думаю дело в том, что лямбда же транслируется в класс а-ля функтор и при трансляции уже получается нечто похожее на мой пример, а auto не может определять тип аргумента функции (для этого есть шаблоны).

Ну и конечно же цитата из стандарта
7.1.6.4 auto specifier
1 The auto type-specifier signifies that the type of a variable being declared shall be deduced from its initializer
or that a function declarator shall include a trailing-return-type.
1
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
04.06.2013, 18:29 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Tulosba, Потому что фейл в стандарте, который исправят в С++14. Так называемые generic lambdas
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3649.html
4
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,356
Записей в блоге: 2
Завершенные тесты: 1
04.06.2013, 18:34 #4
Получается они фичей auto хотят реализовать что-то типа экзотических темлейтов.

Не по теме:

Все правильно, люди базовый синтаксис С++ всего лишь за полтора года осваивают, непорядок
"Мы сделаем С++ лучше" сказали они, "он будет еще удобней" сказали они.

0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
04.06.2013, 18:37 #5
Kastaneda, Ну. Это не будет являться экзотическим темплейтом. Вцелом логично, раз ввели лямбду - то почему обязаны указывать тип параметра, если компилятор его 100% знает?

Не по теме:

А так-то чисто ради интереса почекайте то, что предлагают для стандарта С++14/С++17. Там ооочень много интересного

0
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,356
Записей в блоге: 2
Завершенные тесты: 1
04.06.2013, 20:24 #6
Цитата Сообщение от ForEveR Посмотреть сообщение
Это не будет являться экзотическим темплейтом
Судя по этому
C++
1
2
3
4
5
6
7
8
9
10
11
12
auto Identity = [](auto a) { return a; };
 
int three = Identity(3);
 
char const* hello = Identity("hello");
 
 
 // Conversion to function pointer for capture-less lambdas
 
int (*fpi)(int) = Identity;
 
char (*fpc)(char) = Identity;
как раз будет что-то типа шаблона.
Будут созданы
C++
1
[](int a) { return a; };
и
C++
1
[](char a) { return a; };
т.е. мы пишем как бы "синтаксический макрос", а компилятор делает его реализации для разных типов в зависимости от использования этого "макроса".

Добавлено через 53 минуты

Не по теме:

Цитата Сообщение от ForEveR Посмотреть сообщение
А так-то чисто ради интереса почекайте то, что предлагают для стандарта С++14
О, появится возможность задавать числа в двоичной системе счисления, давно пора
Еще что-то типа OpenMP, динамические массивы (!!!) и много другого.

1
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
04.06.2013, 22:16  [ТС] #7
Цитата Сообщение от ForEveR Посмотреть сообщение
Потому что фейл в стандарте, который исправят в С++14.
Не совсем понял, что из этого следует: код должен собираться как C++11 или не должен?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
05.06.2013, 00:27 #8
Tulosba, Нет. При разработке лямбд не была учтена/не показалась важной эта деталь. Поэтому подали предложение на исправление этого в С++14 (т.е. добавление нового функционала к лямбдам).
1
05.06.2013, 00:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.06.2013, 00:27
Привет! Вот еще темы с ответами:

Лямбда-выражения. Как описать лямбда-процедуру и передать в нее файловую переменную? - PascalABC.NET
Погуглив не смогла найти ответов на свои вопросы. Есть следующая процедура, которая находит положительные числа в одном файле и...

Sandboxie допускает приложение к реестру? - Эмуляторы
Запустил exe-файл в песочнице,потом запустил Process Manager ,он показал мол exe-файл обращается в реестр. Это нормально?

TcpListener не допускает создание новой формы - C#
Здравствуйте! Может мне кто-нибудь подскажет, выход из следующей ситуации... есть форма, мне нужно чтобы при нажатии кнопки создавалась...

Почему таблица больше не допускает редактирование - MS Access
Возникла неожиданно такая проблема: присоединённая через источник данных ODBC таблица с сервера SQL 2000 в акцессовской базе перестала...


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

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

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