从lambdas使用的静态变量未初始化

时间:2017-08-23 13:01:11

标签: c++ regex lambda

我试图在lambda中使用静态变量,就像这样

void scrape_link(const std::string& url, std:function<void()> callback)
{
    static const std::regex link_match { 
        R"re(href="([^"]+)")re",
        std::regex_constants::optimize
    };

    async_download(url,[callback=std::move(callback)] (std::vector<char>& data)
    {
        std::smatch matches;
        if(std::regex_search(data.begin(), data.end(), matches, link_match))
            std::cout << matches[1] << std::endl;
        callback();
    });
}

当我编译此代码而没有-O3标志时,我似乎没有遇到任何问题。它按预期工作。但是打开标志后,正则表达式搜索每次都会失败。我怀疑link_match对象没有正确初始化。知道如何解决这个问题吗?

请注意,lambda是从另一个线程异步调用的。

更新:好像是编译器问题。我在gcc 6.2上编译了这个。我没有在gcc 7.2中观察到这个问题。

1 个答案:

答案 0 :(得分:0)

乍一看,这似乎是一个编译器错误。 link_match未在其直接范围内使用,这可能会使优化程序混淆。这是一个解决方法:

void scrape_link(const std::string& url, std:function<void()> callback)
{
    static const std::regex link_match { 
        R"re(href="([^"]+)")re",
        std::regex_constants::optimize
    };

    // force the creation of link_match by using it in the capture clause.

    async_download(url,[&link_match, callback=std::move(callback)] (std::vector<char>& data)
    {
        std::smatch matches;
        if(std::regex_search(data.begin(), data.end(), matches, link_match))
            std::cout << matches[1] << std::endl;
        callback();
    });
}