我正在尝试通过(可变)lambda 中的副本来捕获 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 说明符。
但它似乎并不直观。