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

时间:2017-03-25 09:36:28

标签: 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 << Test<int>::lambda(123) << endl;
}

我用constexpr和const尝试了两个版本。

在第一种情况下,我得到:

../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]

1 个答案:

答案 0 :(得分:1)

核心常量表达式可能只包含一个从C ++ 17开始的lambda(参见cppreference point 8)。这是proposal N24487并以P0170R0进入C ++ 17。

如果必须使用静态lambda,则可以使用construct at first use idiom

#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;
}