c++ - lambda 中使用的静态变量未初始化

标签 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 中观察到这个问题。

最佳答案

乍一看,这似乎是一个编译器错误。 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();
    });
}

关于c++ - lambda 中使用的静态变量未初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45840508/

相关文章:

c++ - 这个 sha 256 函数有什么问题?

c++ - 如果我是唯一一个直接访问对象的人,为什么我应该将属性设为私有(private)?

c++ - 需要在 C++ 中简单演示调用 Delphi DLL

java - 如何使用匹配器知道是否有不需要的字符?

c++ - 如何迭代(在类之外)一个私有(private)成员,它是一个 vector<unique_ptr<T>>

regex - JAPE(Java注释模式引擎)中正则表达式运算符的区别

regex - 为什么在我的 flex lexer 中,行数在一种情况下增加而在另一种情况下不增加?

c# - 使用 ForEach 语句修改列表的元素

c# - 如何迭代确定 C# 表达式树的深度?

android - android 中的 Lambda 表达式