Constexpr变量不能具有非文字类型'const CurlHandle'

问题描述 投票:0回答:1

在下面的代码中,我在类的私有部分的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;
    }
};

我无法编译代码。我不明白发生了什么事?

c++ json oop stl
1个回答
0
投票

让我们考虑以下示例:

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

© www.soinside.com 2019 - 2024. All rights reserved.