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

C++

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

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

04.06.2013, 11:56. Просмотров 6015. Ответов 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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.06.2013, 11:56     Лямбда не допускает auto
Посмотрите здесь:

Каким образом unordered_map выдает правильное значение для ключа, если его хеш функция допускает коллизии? - C++
Читаю книгу джосаттис стандартная библиотека c++, там в разделе про unordered_map есть описание данного контейнера Раз уж каждый...

auto - C++
Хочу сделать автомат. переменную auto int x; auto double f; Ругается. Как исправить?

Свой auto pointer - C++
Есть учебное задание: Реализовать шаблонный класс auto_ptr. Прошу подсказать все ли идейно правильно написано. Что стоит исправить и...

Спецификатор типа auto - C++
int num1 = 0; auto ptr1 = &amp;num1; // 1. ok: ptr1 is (int *) auto calculates the (int *) auto *ptr2 = &amp;num1; // 2. ok:...

Ссылка и спецификатор auto - C++
Здравствуйте. Простой вопрос, если не сложно. const int ci=i, &amp;cr=ci; auto b=ci; auto c=cr; auto d=&amp;i; auto e=&amp;ci; ...

Функция возвращает auto - C++
В настройках ставлю галочку Have g++ follow the C++11 ISO C++ language standard Но все равно не компилится. template&lt;typename...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Форумчанин
Эксперт С++
4511 / 2853 / 227
Регистрация: 12.12.2009
Сообщений: 7,248
Записей в блоге: 1
Завершенные тесты: 1
04.06.2013, 18:23     Лямбда не допускает auto #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.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
04.06.2013, 18:29     Лямбда не допускает auto #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Tulosba, Потому что фейл в стандарте, который исправят в С++14. Так называемые generic lambdas
http://www.open-std.org/jtc1/sc22/wg...013/n3649.html
Kastaneda
Форумчанин
Эксперт С++
4511 / 2853 / 227
Регистрация: 12.12.2009
Сообщений: 7,248
Записей в блоге: 1
Завершенные тесты: 1
04.06.2013, 18:34     Лямбда не допускает auto #4
Получается они фичей auto хотят реализовать что-то типа экзотических темлейтов.

Не по теме:

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

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

Не по теме:

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

Kastaneda
Форумчанин
Эксперт С++
4511 / 2853 / 227
Регистрация: 12.12.2009
Сообщений: 7,248
Записей в блоге: 1
Завершенные тесты: 1
04.06.2013, 20:24     Лямбда не допускает auto #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, динамические массивы (!!!) и много другого.

Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
04.06.2013, 22:16  [ТС]     Лямбда не допускает auto #7
Цитата Сообщение от ForEveR Посмотреть сообщение
Потому что фейл в стандарте, который исправят в С++14.
Не совсем понял, что из этого следует: код должен собираться как C++11 или не должен?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.06.2013, 00:27     Лямбда не допускает auto
Еще ссылки по теме:

Auto и универсальные ссылки - C++
Добрый день! Помогите разобраться с фишками из С++11. Есть такой код: static int i; class A{ int i_; public: ...

Можно ли заменить на auto ? - C++
static ExtraItem * GetExtraItemByIndex(size_t Index) { static List &lt;ExtraItem *&gt; ::iterator ExtraItem = NULL; for (ExtraItem =...

Template<typename T> vs auto - C++
template &lt;typename T&gt; vector&lt;T&gt; my_vec1; vector&lt;auto&gt; my_vec2;Какая разница между содержимым vec1 и vec2?

лямбда функция - C++
привет всем! не понимаю в чем ошибка...вот код vector&lt;string&gt; tmp_count; list&lt;string&gt; tmp_result = str; for(auto i =...


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

Или воспользуйтесь поиском по форуму:
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
05.06.2013, 00:27     Лямбда не допускает auto #8
Tulosba, Нет. При разработке лямбд не была учтена/не показалась важной эта деталь. Поэтому подали предложение на исправление этого в С++14 (т.е. добавление нового функционала к лямбдам).
Yandex
Объявления
05.06.2013, 00:27     Лямбда не допускает auto
Ответ Создать тему
Опции темы

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