Я пытался раскрыть некоторые плюсы нового стандарта C ++ 11 (используя g ++ 4.6.2). Играя с лямбдами в функции алгоритма "all_of", я столкнулся со странной проблемой с классификатором std ::.
Я "использую" пространство имен std, как показано в начале фрагмента кода. Это делает объявление парной переменной в цикле for хорошо определенным.
Однако я попробовал то же самое в лямбда-аргументе, используемом в алгоритме "all_of". Я наткнулся на несколько трудных для понимания сообщений об ошибках, прежде чем понял, что там будет работать полная std :: qualised std :: pair, но только пара не будет.
Я упустил важный момент? Объявление лямбды происходит в этом файле, поэтому пространство имен здесь должно быть активным, верно? Или требуемый спецификатор std :: qualifier зависит от некоторого кода STL в другом файле? Или это может быть ошибка в g ++?
С наилучшими пожеланиями,
Питер
PS: код компилируется без предупреждений, как вставлено здесь, но удаляя std :: в all_of lambda, я получаю сообщение об ошибке.
#include <iostream>
#include <memory>
#include <map>
#include <string>
#include <algorithm>
#include <utility>
using namespace std;
void duckburg() {
const int threshold = 100;
map <string, int> money;
money["donald"] = 200;
money["daisy"] = 400;
money["scrooge"] = 2000000;
// obviously, an "auto" type would work here nicely,
// but this way my problem is illustrated more clearly:
for (const pair <string, int> &pair : money) {
cout << pair.first << "\t" << pair.second << endl;
}
if (all_of(money.begin(), money.end(),
[&](std::pair<string, int> p) {
return bool(p.second > threshold);
}))
{
cout << "yes, everyone is rich!";
} else {
cout << "no, some are poor!";
};
}
Редактировать: Только что заметил, что получил ответ на этот старый вопрос. Нет проблем с этим, но, пожалуйста, уточните причины. Это поможет мне улучшить будущие вопросы, и в итоге все сообщество получит прибыль. Спасибо!