2017-11-04 20 views
4

次の例を考えてみます。ここCONSTのstd ::関数は(非const演算子をラップ)/可変ラムダ

#include <iostream> 
#include <functional> 

struct A 
{ 
    int i; 
    void operator()() 
    { 
     std::cout << ++i; 
    } 
}; 

void test(std::function<void()> const& fun) 
{ 
    fun(); 
} 

int main() { 
    const std::function<void()> f{A{}}; 
    test(f); 
    test(f); 
} 

conststd::functionoperator()const非を呼び出すことができます。

出力:

12 

同じことが起こるIが供給場合mutableラムダ例えばtest([x = 0]() mutable { ++x; });

どのようにすることができますか?

通常、const std::functionは可変ファンクタをラップできますか?

答えて

6

通常、const std::functionは可変ファンクタをラップできますか?

残念ながら、はい。 std::function::operator()は無条件でconstと見なされ、ラップされたCallableが変更されているかどうかは関係ありません。いくつかの論文は、この問題に取り組むためにしようとしましたが、私の知る限り何もコンクリートは、まだ決定されました:

関連する問題