2016-08-23 60 views
4
#define _GLIBCXX_CONCEPT_CHECKS 
#include <regex> 
void f() { std::regex r("hello"); } 

當在任一GCC或鏘以上is compiled如C++ 11,將產生一個巨大模板誤差,關鍵部分似乎其中爲:爲什麼創建一個`std :: regex`違反概念?

/opt/gcc-5.3.0/include/c++/5.3.0/bits/boost_concept_check.h:206:11: error: use of deleted function 'std::__detail::_StateSeq >& std::__detail::_StateSeq >::operator=(const std::__detail::_StateSeq >&)'
__a = __a; // require assignment operator
^

但是考慮在一個猜測這是什麼意思,我注意到std::regex does have an assignment operator

此外,我的理解是,啓用概念不應改變代碼是否編譯。但是,刪除#define使其編譯。


問題的兩個部分:

  1. 這是錯誤和概念才能啓用它的外觀,正確的行爲?
  2. 如果是的話,我如何假設作出正則表達式?
+0

只是猜測,嘗試在構造函數中使用'std :: string'而不是字符串常量。 –

+0

gcc 6.1沒有給出任何錯誤,似乎是一個老gcc的bug –

回答

4

你的代碼更改爲以下:

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

這將禁用概念檢查正則表達式庫代碼,但會離開啓用概念檢查其他任何你想在這個編譯單元做。基本上,您擁有的正則表達式庫的版本與您的編譯器版本檢查的概念檢查不兼容。這個錯誤發生在使用C++ 11的GCC版本5.3或更低版本中,但在版本6.1或更高版本中也沒有看到,它也使用C++ 11.

0

在我的GCC 5.4項目中,我必須首先將<regex>放入我的includes檢查整個項目(如在makefile中設置),因爲顯然有一些間接的方式,它與其他頭交互,其中沒有包括正則表達式直接本身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