为什么创建`std :: regex`违反概念?

时间:2016-08-23 03:05:36

标签: c++

#define _GLIBCXX_CONCEPT_CHECKS
#include <regex>
void f() { std::regex r("hello"); }

当GCC或Clang中的上述is compiled为C ++ 11时,会生成巨大的模板错误,其关键部分似乎是:

  

/opt/gcc-5.3.0/include/c ++ / 5.3.0 / bits / boost_concept_check.h:206:11:错误:使用已删除的函数'std :: __ detail :: _ St​​ateSeq&gt;&amp; std :: __ detail :: _ St​​ateSeq&gt; :: operator =(const std :: __ detail :: _ St​​ateSeq&gt;&amp;)'
  __a = __a; //需要赋值运算符
  ^

但是猜测这意味着什么,我注意到std::regex does have an assignment operator

此外,我的理解是,启用概念不应该改变代码是否编译。但是,删除#define会使其编译。

两部分问题:

  1. 此错误及其外观仅在启用概念时才正确行为?
  2. 如果是,我如何制作正则表达式?

2 个答案:

答案 0 :(得分:4)

将您的代码更改为以下内容:

#include <regex>
#define _GLIBCXX_CONCEPT_CHECKS
void f() { std::regex r("hello"); }

这将禁用对正则表达式库代码的概念检查,但会为您在此编译单元中执行的任何其他操作启用概念检查。基本上,您拥有的正则表达式库的版本与您的编译器版本检查的概念检查不兼容。在使用C ++ 11的GCC 5.3或更低版本中可以看到此错误,但在使用C ++ 11的版本6.1或更高版本中看不到。

答案 1 :(得分:0)

使用我的GCC 5.4项目,当对整个项目进行概念检查(在makefile中设置)时,我必须先将<regex>放在我的包含中,因为显然有一些间接的方式它与它交互其他标题,其中没有一个直接包含正则表达式AFAICT。

#ifdef _GLIBCXX_CONCEPT_CHECKS
#undef _GLIBCXX_CONCEPT_CHECKS // GCC 5 library bug requires that we disable this for regex 
#define NEED_REDEF_OF_GLIBCXX_CONCEPT_CHECKS
#endif
// Standard headers
#include <regex>
#ifdef NEED_REDEF_OF_GLIBCXX_CONCEPT_CHECKS
#define _GLIBCXX_CONCEPT_CHECKS
#endif
// Other headers here