繁体   English   中英

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

[英]Why Does Creating a `std::regex` Violate Concepts?

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

当在GCC或Clang中将上述内容编译为C ++ 11时,会生成一个巨大的模板错误,其关键部分似乎是:

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

但是猜测这意味着什么,我注意到std :: regex确实有一个赋值运算符

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


两部分问题:

  1. 是这个错误,只有在启用概念时它的外观才是正确的行为?
  2. 如果是的话,我怎么做一个正则表达式?

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

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

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

在我的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM