std::regex_search与gcc 4.9.1的结果不一致

Inconsistent results from std::regex_search with gcc 4.9.1

本文关键字:结果 不一致 gcc regex search std      更新时间:2023-10-16

我从std::regex_search中得到了各种错误的结果,这似乎取决于程序中的其他代码:

#include <regex>
#include <iostream>
int main(){
  std::smatch res;
  std::regex_search(std::string("fooquxbarquack"),res,std::regex("foo(?=qux)(.*)ar"));
  std::cout<<res[0]<<std::endl;
  std::regex_search(std::string("foofofowoof"),res,std::regex("(o.){4}"));
  std::cout<<res[0]<<std::endl;
  return 0;
}

输出(格式化为c字符串):

fooquxba0n
ofofowxB0x00n

如果我反转测试,输出变为:

ofofowxD0x00n
fooquxbarn

对于代码的其他安排,它有时会产生预期的输出(fooquxbarofofowoo)。

gcc版本:

$ ../bin/gcc -v
Using built-in specs.
COLLECT_GCC=../bin/gcc
COLLECT_LTO_WRAPPER=/compilers/gcc_r/4.9.1rh62/libexec/gcc/x86_64-unknown-linux-gnu/4.9.1/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: /free/tmp/gccwork/gcc-4.9.1//configure --prefix=/compilers/gcc_r/4.9.1rh62/
Thread model: posix
gcc version 4.9.1 (GCC) 

您不能调用regex_searchregex_match重载,使用临时std::string来获取match_results。(好吧,你可以,在C++14之前,但你不能对结果做任何有用的事情。)

这些函数用迭代器将match_results填充到您传递的字符串中,但如果您传递一个临时std::string,则在完整表达式结束时该临时会被销毁,迭代器也会无效。当您稍后尝试使用res[0]时,会产生未定义的行为。

这就是为什么在C++14 LWG第2329期中添加了明确删除的重载,以防止它们被临时调用。看起来libstdc++还没有实现这一点。您的代码不会在C++14模式下使用clang和libc++进行编译。