将lambda放入概念中是否有任何问题?

问题描述

以这个概念为例-具有名为 func 的成员的所有类都应满足此概念。

template<class T>
concept has_func =
requires(T) {
   { [](T& t,auto&&... args){
         t.func(args...);
      }
   };
};

struct stemplateFunc {
    template<class T>
    void func(T){};
};

template<has_func E>
void FuncFunc(E a) {}

int main() {
   FuncFunc(stemplateFunc{});
}

此技巧是否存在任何问题-将lambda放入概念中还是将通用lambda或可变参数lambda放入?

gcc 10.2接受它:godbolt

解决方法

使用类型特征的途径似乎更惯用,并且也适用于所有三大编译器。

template<class T>
concept has_func = std::is_member_function_pointer_v<decltype(&T::func)>;

Godbolt

,

您建议的lambda格式不正确,如果替换的T没有这样的成员func,则不需要诊断,因为其函数调用操作符模板没有有效的实例化(并且永远无法实例化; [temp.res] /8.1)。这与SFINAE的限制相同。