在下面的代码中,我在类的私有部分的constexpr static auto f = [](CURL* c)
行上收到错误和警告。
Constexpr变量不能具有非文字类型'const CurlHandle ::((/ alienware / CLionProjects / Bitcoin / main.cpp:48:31处的lambda)'lambda闭包类型是C ++ 17之前的非文字类型]
class CurlHandle {
private :
CURL_ptr curlptr;
std::string data;
std::array<char, CURL_ERROR_SIZE> errorBuffer;
constexpr static auto f = [](CURL* c) {
curl_easy_cleanup(c);
curl_global_cleanup();
};
public :
CurlHandle() : curlptr(curl_easy_init(), f) {
CURLcode code = CURLE_OK;
code = curl_global_init(CURL_GLOBAL_ALL);
if (code != CURLE_OK){
throw CurlException(static_cast<int>(code), "Unable to global init");
}
curl_easy_setopt(curlptr.get(), CURLOPT_ERRORBUFFER, &errorBuffer[0]);
if (code != CURLE_OK){
throw CurlException(static_cast<int>(code), "Unable to set error buffer");
}
curl_easy_setopt(curlptr.get(), CURLOPT_WRITEFUNCTION, dataHandler);
if (code != CURLE_OK){
throw CurlException(static_cast<int>(code), std::string(&errorBuffer[0]));
}
curl_easy_setopt(curlptr.get(), CURLOPT_WRITEDATA, &data);
if (code != CURLE_OK){
throw CurlException(static_cast<int>(code), std::string(&errorBuffer[0]));
}
}
void setUrl(const std::string& url) {
CURLcode code = curl_easy_setopt(curlptr.get(), CURLOPT_URL, url.c_str());
if (code != CURLE_OK){
throw CurlException(static_cast<int>(code), std::string(&errorBuffer[0]));
}
}
void fetch() {
data.empty();
CURLcode code = curl_easy_perform(curlptr.get());
if (code != CURLE_OK){
throw CurlException(static_cast<int>(code), std::string(&errorBuffer[0]));
}
}
const std::string& getFetchedData() const {
return data;
}
};
我无法编译代码。我不明白发生了什么事?
让我们考虑以下示例:
constexpr auto f = []() {};
int main()
{
f();
return 0;
}
此处,constexpr
变量f
的类型为const<lambda()>
。编译器抱怨<lambda()>
不是文字,因为它是closure type,并且闭包类型仅是C ++ 17起的文字。
[现在,您可以使用C ++ 17进行尝试,看看是否可以在编译时使用libcurl
,但是我认为这超出了范围。请记住,constexpr
说明符声明可以在编译时评估函数或变量的值(ref)。因此,如果您在lambda中使用某些在编译时无法求值的变量或函数,则该lambda也无法在编译时求值,因此也不能为constexpr
。