Próbuję przechwycić obiekt const za pomocą kopii w (zmiennym) lambda. Mój kompilator jednak skarży się, że przechwycony obiekt jest const.Skopiowany obiekt const w zamknięciu lambda niezmiennym
Czy nie można skopiować obiektu jako niestałego?
struct Foo
{
Foo(){}
void Func(){}
};
int main()
{
const Foo foo;
[foo]() mutable { foo.Func(); };
}
Kompilacja z 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*’
kompilacji z brzękiem ++ 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(); });
Dokument Standard (lub raczej projekt ...) definiuje w 5.1.2.14 "Typ [...] jest typem odpowiedniego przechwyconego bytu", więc myślę, że zawierałby specyfikatory cv.
Nie wydaje się to jednak intuicyjne.
Można jawnie skopiować wewnątrz ciała lambda, ale myślę, że nie tego szukacie. Można oczywiście wziąć odwołanie do wartości r jako parametr podany w C++ 11. – CashCow
Jakie jest pytanie? – chill
@chill To jest pytanie: dlaczego skopiowany obiekt foo wewnątrz lambda jest const? –