Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ &引用;始终使用命名的正则表达式,而不是临时的为什么?_C++_Regex_Stl - Fatal编程技术网

C++ &引用;始终使用命名的正则表达式,而不是临时的为什么?

C++ &引用;始终使用命名的正则表达式,而不是临时的为什么?,c++,regex,stl,C++,Regex,Stl,Stephan T.Lavavej在他的正则表达式演示中提到,永远不应该使用临时正则表达式对象。当然,我可以想到一些效率方面的原因。但似乎有更“明确”的理由避免使用临时对象。一旦我用临时正则表达式替换命名正则表达式,示例代码就会停止工作。你知道确切的解释是什么吗 UPD:如果使用临时对象,则中的示例代码将被破坏: const regex r("\\w*day"); string s; getline(cin, s); const sregex_iterator end; // works:

Stephan T.Lavavej在他的正则表达式演示中提到,永远不应该使用临时正则表达式对象。当然,我可以想到一些效率方面的原因。但似乎有更“明确”的理由避免使用临时对象。一旦我用临时正则表达式替换命名正则表达式,示例代码就会停止工作。你知道确切的解释是什么吗

UPD:如果使用临时对象,则中的示例代码将被破坏:

const regex r("\\w*day");
string s;
getline(cin, s);

const sregex_iterator end;

// works:
//for (sregex_iterator i(s.begin(), s.end(), r);

// doesn't work:
for (sregex_iterator i(s.begin(), s.end(), regex("\\w*day"));
    i != end; ++i)
{
    cout << (*i)[0] << endl;
}
const regex r(\\w*天);
字符串s;
getline(cin,s),;
常量sregex_迭代器end;
//作品:
//for(sregx_迭代器i(s.begin(),s.end(),r);
//不起作用:
对于(sregex_迭代器i(s.begin()、s.end()、regex(\\w*day));
i!=结束;++i)
{

cout命名正则表达式(至少带有boost)的优点是它只能编译一次。如果多次应用正则表达式,这是一个性能优势,可能会产生很大的影响

顺便说一句,我从来没有用“永远不要这样做”这样的字眼来表达这样的指导方针。事实是 一旦您存储了正则表达式,每次都要意外地重新编译它并非不可能 (如果您存储了它,但忘记了
静态常量
和使正则表达式保持其编译状态机的标志等)


此外,一些正则表达式库甚至会使用statiscal(MRU)自动缓存已编译的正则表达式方法来优化它。在某些情况下,这可能比手动保留一个“命名”的正则表达式更好。

更多地思考这个问题,我意识到
regex\u迭代器的构造函数引用了
regex
,这当然可以解释问题。将引用传递给临时对象显然是一种错误Byt.< BatchyX >你在哪里找到了“C++/STL中的RexEx”?我猜你没有那个示例代码,不能复制它?@ BMululy:是一个新的C++标准的C++头,它的MRU解决方案不能适合C++。添加静态const并不难。@你会惊讶于MRU缓存的工作原理;大多数程序根本不使用C++。在许多分辨率下,但是是的,能够保持编译后的版本确实是一个胜利。@dfan:感谢您指出我的答案是针对一个完全不同的问题。已删除。不,它需要一个
常量
引用,并且使用一个临时值是完全正确的-否则代码甚至无法编译,这将是一个类型错误。