14718


次のようなc++例題がコンパイルできません。

[code]

    #include <iostream>
    #include <regex>
    
    int main(int argc, char* argv[]){
      using namespace std;
      smatch sm;
      cout << regex_match(string("hahaha"), sm, regex("(ha){3}")) << endl;
      return 0;
    }
    
[/code]

Mac OS X 10.9 + clang++ またはwindows + cygwin + gcc 4.9
では上の例はちゃんとコンパイルされ、予測している結果の1を出力します。  
しかし、linuxでgccを使ってコンパイルすると何故か次のように怒られます。

[code]

    foo.cpp: In function ‘int main(int, char**)’:
    foo.cpp:13:61: error: use of deleted function ‘bool std::regex_match(const std::basic_string<_Ch_type, _Ch_traits, _Ch_alloc>&&, std::match_results<typename std::basic_string<_Ch_type, _Ch_traits, _Ch_alloc>::const_iterator, _Alloc>&, const std::basic_regex<_Ch_type, _Rx_traits>&, std::regex_constants::match_flag_type) [with _Ch_traits = std::char_traits<char>; _Ch_alloc = std::allocator<char>; _Alloc = std::allocator<std::sub_match<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> > > >; _Ch_type = char; _Rx_traits = std::regex_traits<char>; typename std::basic_string<_Ch_type, _Ch_traits, _Ch_alloc>::const_iterator = __gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >]’
       cout << regex_match(string("hahaha"), sm, regex("(ha){3}")) << endl;
                                                                 ^
    In file included from /usr/include/c++/5.1.0/regex:61:0,
                     from foo.cpp:6:
    /usr/include/c++/5.1.0/bits/regex.h:2073:5: note: declared here
         regex_match(const basic_string<_Ch_type, _Ch_traits, _Ch_alloc>&&,
         ^
    
[/code]

コンパイル環境は Arch GNU/Linux で、gccヴァージョンは5.1です。

私が見る限りでは例のソース自体は問題がないように見えます。  
ただ、ソースのsmをcmatchに変え、文字列をstringでなくc_strにすればコンパイルされますが、私はc_strよりstringが使いたいです。


CC BY-SA 3.0
2015-08-21T23:58:38.790
14717
2015-08-22T00:11:00.340
2015-08-22T00:09:17.023
10856
10856
question
c++ 正規表現 c++11
linuxでregex_matchするとuse of deleted functionって怒らっれる。

[code]

    cout << regex_match(string("hahaha"), sm, regex("(ha){3}")) << endl;
    
[/code]

この場合、`regex_match()`が完了した時点で`string("hahaha")`のデストラクターが実行され文字列が解放されてしまいます。そうするとその文字列を指している`smatch
sm`の内容が不正になってしまいます。  
このような過ちを犯さないよう禁止されています。対処法としてはソースコード上は文字列を`regex_match`よりも広いスコープで定義することですが、正しく実行することも考えて`smatch
sm`よりも広いスコープで定義することをお勧めします。

[code]

    string hahaha("hahaha");
    smatch sm;
    cout << regex_match(hahaha, sm, regex("(ha){3}")) << endl;
    
[/code]

[cppreference.com](http://en.cppreference.com/w/cpp/regex/regex_match)によるとdeleteされたのはC++14だそうです。（Linuxとは関係ありません。）


CC BY-SA 3.0
2015-08-22T00:11:00.340
14718
2015-08-22T00:11:00.340
4236
14717
answer