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

C++ lambda中使用的静态变量未初始化,c++,regex,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(

我试图在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();
    });
}
void scrape_链接(const std::string和url,std:函数回调)
{
静态常量std::正则表达式链接匹配{
R“re(href=”([^“]+)”)re”,
std::regex_常量::优化
};
异步下载(url,[callback=std::move(callback)](std::vector&data)
{
std::smatch匹配;
if(std::regex_搜索(data.begin()、data.end()、matches、link_match))

std::cout乍一看,这似乎是一个编译器错误。
link\u 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();
    });
}
void scrape_链接(const std::string和url,std:函数回调)
{
静态常量std::正则表达式链接匹配{
R“re(href=”([^“]+)”)re”,
std::regex_常量::优化
};
//在capture子句中使用link_match,强制创建link_match。
异步下载(url,[&link\u match,callback=std::move(callback)](std::vector&data)
{
std::smatch匹配;
if(std::regex_搜索(data.begin()、data.end()、matches、link_match))

std::cout“我怀疑链接匹配对象没有正确初始化…”你能插入一个断点并进行检查吗?在im调试时,它似乎被正确初始化,但正则表达式搜索仍然失败。是否有标志
-O3
和无标志
std::optimize
?是的,即使没有标志std::optimize,它也会失败。使用
-O2
进行尝试,这样我们就可以将其缩小到
GCC
标志,有什么用结果如何?这是一个很好的观点,我想这将解决
GCC v6.2
上的问题(@user1353535可以确认)。但是,它仍然是一个编译器错误,因为它是一个有效的代码,不能在捕获lambda时传递静态对象。是的。好消息是OP报告GCC 7.2没有表现出相同的行为。