2017-03-25 140 views
1

我有一个模板类,它带有一个静态成员变量,我想要成为一个lambda函数。为什么它不起作用?将一个lambda函数赋值给静态成员变量(C++)

#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

第一种情况下将正常工作与C++ 17。 – songyuanyao

+0

谢谢!我会找到解决办法。 – biowep

+0

你为什么不简单地使用静态函数? ...毕竟,对于'Test'的每个单独实例都会有不同的结果。 – WhiZTiM

回答

1

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

如果你必须使用一个静态拉姆达,您可以使用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; 
} 
+1

如果你有C++ 14推导的返回类型,你可能会摆脱'std :: function'包装。 –