Я думаю 5.1.5/3 это то, что мешает вам использовать лямбду, как вы будете использовать его, я извиняюсь:
[...] Лямбда-выражение не должно появляться в невычисленном операнде (Параметр [expr]), в аргументе шаблона, в объявлении alias, в объявлении typedef или в объявлении шаблона функции или функции вне его тела функции и аргументов по умолчанию. [Примечание. Цель состоит в том, чтобы предотвратить появление лямбда в подписи. - конец примечание] [...]
Тем не менее, C++ 14 действительно позволяют определить тип элемента, используя шаблоны, как показано в следующем примере:
template<typename F>
struct S;
template<typename R, typename... Args>
struct S<R(Args...)> {
using member = R(Args...);
R operator()(Args...) { return R{}; }
member M;
};
template<typename R, typename... Args>
R S<R(Args...)>::M(Args...) { return R{}; }
int main() { S<void(int)> s; }
Что польза от типа псевдоним? Вы уже обнаружили, что это умаляет вашу способность определять члена внутри класса. – chris
@chris, может быть, он хочет использовать его как тип для 'std :: function'? –
Я просто изучаю темные углы стандарта C++, чтобы найти новые способы написания более общего кода. – Gaetano