我试图在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中观察到这个问题。
答案 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();
});
}