我正在尝试像这样在 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/