我有一个带有静态成员变量的模板类,我想成为一个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]
答案 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;
}