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

时间:2014-09-17 13:45:56

标签: c++ regex gcc c++11

我从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字符串):

fooquxba0\n
ofofow\xB0\x00\n

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

ofofow\xD0\x00\n
fooquxbar\n

对于代码的其他安排,它有时会产生预期的输出(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) 

1 个答案:

答案 0 :(得分:4)

您无法通过regex_search暂时regex_match来调用match_resultsstd::string次超载。 (嗯,你可以,预先C ++ 14,但你不能对结果做任何有用的事情。)

这些函数使用迭代器将match_results填充到您传递的字符串中,但是如果传递临时std::string,则在完整表达式结束时销毁临时值,并且迭代器失效。当您稍后尝试使用res[0]时,会导致未定义的行为。

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