Как использовать лямбда-выражение в качестве параметра шаблона? Например. как класс сравнения, инициализирующий std:: set.
Следующее решение должно работать, поскольку выражение лямбда просто создает анонимную структуру, которая должна быть подходящей в качестве параметра шаблона. Однако возникает множество ошибок.
Пример кода:
struct A {int x; int y;};
std::set <A, [](const A lhs, const A &rhs) ->bool {
return lhs.x < rhs.x;
} > SetOfA;
Выход ошибки (я использую компилятор g++ 4.5.1 и --std = С++ 0x флаг компиляции):
error: ‘lhs’ cannot appear in a constant-expression
error: ‘.’ cannot appear in a constant-expression
error: ‘rhs’ cannot appear in a constant-expression
error: ‘.’ cannot appear in a constant-expression
At global scope:
error: template argument 2 is invalid
Это ожидаемое поведение или ошибка в GCC?
ИЗМЕНИТЬ
Как заметил кто-то, я неправильно использую лямбда-выражения, поскольку они возвращают экземпляр анонимной структуры, на которую они ссылаются.
Однако исправление этой ошибки не решает проблему. Я получаю ошибку lambda-expression in unevaluated context
для следующего кода:
struct A {int x; int y;};
typedef decltype ([](const A lhs, const A &rhs) ->bool {
return lhs.x < rhs.x;
}) Comp;
std::set <A, Comp > SetOfA;