powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / Лямбды, for_each и т.д.
13 сообщений из 13, страница 1 из 1
Лямбды, for_each и т.д.
    #39991756
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашёл тут статью про лямбды. Вот пример кода:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
std::map<std::string, int> numbers { 
    { "one", 1 }, {"two", 2 }, { "three", 3 }
};

// каждый раз запись копируется из pair<const string, int>!
std::for_each(std::begin(numbers), std::end(numbers), 
    [](const std::pair<std::string, int>& entry) {
        std::cout << entry.first << " = " << entry.second << '\n';
    }
);


Автор утверждает, что "std::pair" будет копироваться в лямбду, передаваться по значению. Я проверил, вроде бы это так.
Но почему ведь "std::pair" передаётся по ссылке?
...
Рейтинг: 0 / 0
Лямбды, for_each и т.д.
    #39991757
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Потому что итератор для map<K, V> "выдаёт" pair<const K, V>.
Наверняка в статье про это написано.
...
Рейтинг: 0 / 0
Лямбды, for_each и т.д.
    #39991758
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guest
Потому что итератор для map<K, V> "выдаёт" pair<const K, V>.
Наверняка в статье про это написано.

Да написано, я как-то пропустил следующую строчку. Спасибо.
...
Рейтинг: 0 / 0
Лямбды, for_each и т.д.
    #39991759
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravНо почему ведь "std::pair" передаётся по ссылке?

Но тип ключа у него отличается от numbers. Каждый раз создаётся временный объект, который
и передаётся по ссылке.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Лямбды, for_each и т.д.
    #39991762
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но в таком случае у "pair" должен быть оператор неявного преобразования типа: "pair<const K, V> ---> pair<K, V>".

Иначе оно же не компилировалось бы? Что могло сподвигнуть написать такой оператор?
...
Рейтинг: 0 / 0
Лямбды, for_each и т.д.
    #39991769
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravНо в таком случае у "pair" должен быть оператор неявного преобразования типа: "pair<const
K, V> ---> pair<K, V>".

Да. И это автогенерируемый copy constructor.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Лямбды, for_each и т.д.
    #39991781
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravНо в таком случае у "pair" должен быть оператор неявного преобразования типа: "pair<const
K, V> ---> pair<K, V>".

Да. И это автогенерируемый copy constructor.

Здесь копи конструктор? :)

А почему не компилируется тогда?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
template <typename F, typename S>
class my_pair
{
    F f = {};
    S s = {};
};

void printPair(my_pair<std::string, int> const &)
{
}

void testPair()
{
    my_pair<std::string const, int> p;
    printPair(p);
}
...
Рейтинг: 0 / 0
Лямбды, for_each и т.д.
    #39991783
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

petravНо в таком случае у "pair" должен быть оператор неявного преобразования типа: "pair<const
K, V> ---> pair<K, V>".

Да. И это автогенерируемый copy constructor.
🤦‍♂️
...
Рейтинг: 0 / 0
Лямбды, for_each и т.д.
    #39991800
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
А почему не компилируется тогда?

Вы код std::pair откройте, чтобы не думали что там что-то такое же тривиальное )))
А преобразующий конструктор скорее всего таки есть. Но не автогенерируемый.
...
Рейтинг: 0 / 0
Лямбды, for_each и т.д.
    #39991803
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,

Пишите
Код: plaintext
1.
 [](auto&)

Зря что ли люди старались, в язык добавляли.
...
Рейтинг: 0 / 0
Лямбды, for_each и т.д.
    #39991808
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
petrav
А почему не компилируется тогда?

Вы код std::pair откройте, чтобы не думали что там что-то такое же тривиальное )))

А я не открываю потому что знаю что там крайне нетривиально. И с наскока я не разберусь.

Anatoly Moskovsky
А преобразующий конструктор скорее всего таки есть. Но не автогенерируемый.

Я про механизм преобразования. Просто интересно. Это или оператор преобразования типа…
Или, да, конструктор преобразования, но не копирования и уж тем более не автогенерённый.
Или это набор перегруженных функций для преобразования, которые явно там вызываются.

Меня удивляет зачем они это делают? Там само собой такое преобразование не сработает.
Человек в аргументах лямбды написал ссылку и получил передачу аргумента, не по ссылке, а
по значению. Ну просто слов нет.
...
Рейтинг: 0 / 0
Лямбды, for_each и т.д.
    #39991884
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
А почему не компилируется тогда?
Потому что шаблон типа не совпадает.
Используй специализацию.
...
Рейтинг: 0 / 0
Лямбды, for_each и т.д.
    #39991917
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
petrav
А почему не компилируется тогда?
Потому что шаблон типа не совпадает.
Используй специализацию.

Я знаю, это был намёк на то что Сибиряков не прав.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Лямбды, for_each и т.д.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]