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

C++

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

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

04.06.2013, 11:56. Просмотров 5968. Ответов 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
Посмотрите здесь:

Лямбда выражения C++
C++ auto
C++ лямбда функция
Функция возвращает auto C++
Можно ли заменить на auto ? C++
C++ Лямбда функции
C++ Template<typename T> vs auto
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Форумчанин
Эксперт С++
 Аватар для Kastaneda
4253 / 2785 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 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
Модератор
Эксперт С++
 Аватар для ForEveR
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
04.06.2013, 18:29     Лямбда не допускает auto #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Tulosba, Потому что фейл в стандарте, который исправят в С++14. Так называемые generic lambdas
http://www.open-std.org/jtc1/sc22/wg...013/n3649.html
Kastaneda
Форумчанин
Эксперт С++
 Аватар для Kastaneda
4253 / 2785 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
04.06.2013, 18:34     Лямбда не допускает auto #4
Получается они фичей auto хотят реализовать что-то типа экзотических темлейтов.

Не по теме:

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

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

Не по теме:

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

Kastaneda
Форумчанин
Эксперт С++
 Аватар для Kastaneda
4253 / 2785 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 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
:)
Эксперт С++
4384 / 3227 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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
Еще ссылки по теме:

C++ Рекурсивная лямбда
Свой auto pointer C++
Спецификатор типа auto C++
C++ Лямбда функции
C++ Ссылка и спецификатор auto

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

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

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