(変更可能な) ラムダでコピーを介して const オブジェクトをキャプチャしようとしています。ただし、私のコンパイラは、キャプチャされたオブジェクトが const であると不平を言っています。
オブジェクトを非 const としてコピーすることはできないのでしょうか?
struct Foo
{
Foo(){}
void Func(){}
};
int main()
{
const Foo foo;
[foo]() mutable { foo.Func(); };
}
g++ 4.7.2 でコンパイル:
testcase.cpp: In lambda function:
testcase.cpp:10:29: error: no matching function for call to ‘Foo::Func() const’
testcase.cpp:10:29: note: candidate is:
testcase.cpp:4:7: note: void Foo::Func() <near match>
testcase.cpp:4:7: note: no known conversion for implicit ‘this’ parameter from ‘const Foo*’ to ‘Foo*’
clang++ 3.1 でコンパイル:
testcase.cpp:10:20: error: member function 'Func' not viable: 'this' argument has type 'const Foo', but function is not marked const
std::async([foo]() mutable { foo.Func(); });
標準ドキュメント(またはドラフト...)は、5.1.2.14で「タイプ[...]は対応するキャプチャされたエンティティのタイプである」と定義しているため、cv-specifiersが含まれると思います。
ただし、直感的ではないようです。