我从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
对于代码的其他安排,它有时会产生预期的输出(fooquxbar
和ofofowoo
)。
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)
答案 0 :(得分:4)
您无法通过regex_search
暂时regex_match
来调用match_results
或std::string
次超载。 (嗯,你可以,预先C ++ 14,但你不能对结果做任何有用的事情。)
这些函数使用迭代器将match_results
填充到您传递的字符串中,但是如果传递临时std::string
,则在完整表达式结束时销毁临时值,并且迭代器失效。当您稍后尝试使用res[0]
时,会导致未定义的行为。
这就是为什么在C ++ 14中LWG issue 2329添加了显式删除的重载以防止它们被临时调用。看起来libstdc ++还没有实现它。您的代码在C ++ 14模式下不能使用clang和libc ++进行编译。