[英]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 :: _ StateSeq>&std :: __ detail :: _ StateSeq > :: operator =(const std :: __ detail :: _ StateSeq>&)'
__a = __a; //需要赋值运算符
^
但是猜测这意味着什么,我注意到std :: regex确实有一个赋值运算符 。
此外,我的理解是,启用概念不应该改变代码是否编译。 但是,删除#define
会使其编译。
两部分问题:
将您的代码更改为以下内容:
#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.