std::regex_search与gcc 4.9.1的结果不一致
Inconsistent results from std::regex_search with gcc 4.9.1
我从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
对于代码的其他安排,它有时会产生预期的输出(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)
您不能调用regex_search
或regex_match
重载,使用临时std::string
来获取match_results
。(好吧,你可以,在C++14之前,但你不能对结果做任何有用的事情。)
这些函数用迭代器将match_results
填充到您传递的字符串中,但如果您传递一个临时std::string
,则在完整表达式结束时该临时会被销毁,迭代器也会无效。当您稍后尝试使用res[0]
时,会产生未定义的行为。
这就是为什么在C++14 LWG第2329期中添加了明确删除的重载,以防止它们被临时调用。看起来libstdc++还没有实现这一点。您的代码不会在C++14模式下使用clang和libc++进行编译。
相关文章:
- 如何查找导致结果不一致的代码
- 结果与 fstream::read 不一致
- 使用迭代器对向量的C 递归初始化产生不一致的结果
- boost::d ynamic_bitset 与 std::vector 的结果不一致<bool>?
- 使用不同的表达式计算同一整数时的结果不一致
- RapidJSON 在转换为字符串时产生不一致的结果
- 使用两种不同的方法遍历 Vector 的结果不一致
- GDI打印API StartDoc函数给出的结果不一致
- 位掩码结果不一致
- is_assignable<>结果不一致
- opencvmatchTemplate在计算机之间给出不一致的结果
- CPPCheck返回不一致的结果
- 异步函数产生不一致的结果
- 使用 strptime/strftime 的结果不一致
- 在opencv中findChessboardCorners()的结果不一致
- CUDA 共享内存 - 结果不一致
- C++/CImg结果不一致
- 从文件中读取的浮点值与计算结果不一致
- std::regex_search与gcc 4.9.1的结果不一致
- 不同架构下的浮点结果不一致!!如何继续