2017-03-25 172 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'包裝。 –