C++ 将lambda函数分配给静态成员变量(c+;+;)

C++ 将lambda函数分配给静态成员变量(c+;+;),c++,lambda,C++,Lambda,我有一个模板类,其中包含一个静态成员变量,我希望它是一个lambda函数。为什么不起作用 #include <iostream> using namespace std; template <typename T> class Test { public: static constexpr auto lambda = [](T val) -> T { return val; }; }; int main() { cout

我有一个模板类,其中包含一个静态成员变量,我希望它是一个lambda函数。为什么不起作用

#include <iostream>
using namespace std;

template <typename T>
class Test {
public:
    static constexpr auto lambda = [](T val) -> T {
        return val;
    };
};

int main() {
    cout << Test<int>::lambda(123) << endl;
}
#包括
使用名称空间std;
模板
课堂测试{
公众:
静态constexpr auto lambda=[](T val)->T{
返回val;
};
};
int main(){
不能{
^~~~~~
../src/test.cpp:7:20:错误:“const-test::test::lambda”,使用本地类型“const-test::”声明,但从未定义[-fppermissive]

核心常量表达式只能包含一个从C++17开始的lambda(请参阅)。这是C++17中的一个

如果必须使用静态lambda,可以使用:

#包括
模板
课堂测试{
公众:
std::函数createLambda(){
静态常量std::函数returnLambda=[](T val)->T{
返回val;
};
返回lambda;
}
};
int main(){
试验工厂;
std::function n=lambdfactory.createLambda();

std::cout第一种情况在C++17上可以正常工作。谢谢!我会找到解决办法。为什么不简单地使用一个静态函数?…毕竟,
Test
的每个单独实例化都会有不同的静态函数。因为我需要用一个非常短的名称来引用函数,比如n(arg)变量赋值是一个非常直观的概念。相反,通过使用静态函数,用户应该定义一个引用n来测试::myFunction。直到现在我还不知道函数引用是否存在。如果你有C++14推导的返回类型,你可能可以去掉
std::function
包装器。
../src/test.cpp:8:24: error: ‘constexpr const Test<int>::<lambda(int)> Test<int>::lambda’, declared using local type ‘const Test<int>::<lambda(int)>’, is used but never defined [-fpermissive]
  static constexpr auto lambda = [](T val) -> T {
                        ^~~~~~
../src/test.cpp:7:20: error: ‘constexpr’ needed for in-class initialization of static data member ‘const Test<int>::<lambda(int)> Test<int>::lambda’ of non-integral type [-fpermissive]
  static const auto lambda = [](T val) -> T {
                    ^~~~~~
../src/test.cpp:7:20: error: ‘const Test<int>::<lambda(int)> Test<int>::lambda’, declared using local type ‘const Test<int>::<lambda(int)>’, is used but never defined [-fpermissive]
#include <iostream>

template <typename T>
class Test {
public:
    std::function<T(T)> createLambda() {
        static const std::function<T(T)> returnLambda = [](T val) -> T {
            return val;
        };
        return returnLambda;
    }
};

int main() {
    Test<int> lambdaFactory;
    std::function<int(int)> n = lambdaFactory.createLambda();
    std::cout << n(123) << std::endl;
}