Tôi đang cố chụp một đối tượng const qua bản sao trong lambda (có thể thay đổi). Trình biên dịch của tôi tuy nhiên phàn nàn, rằng đối tượng đã capture là const.Đối tượng const đã sao chép trong kết cấu lambda không thể thay đổi được
Nếu không thể sao chép đối tượng dưới dạng không const thì không thể?
struct Foo
{
Foo(){}
void Func(){}
};
int main()
{
const Foo foo;
[foo]() mutable { foo.Func(); };
}
Biên soạn với 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*’
Biên soạn với kêu vang ++ 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(); });
Tài liệu chuẩn (hay đúng hơn là dự thảo ...) định nghĩa trong 5.1.2.14 rằng "Kiểu [...] là kiểu của thực thể được capture tương ứng", vì vậy tôi đoán rằng nó sẽ bao gồm các cv-specifiers.
Mặc dù nó không có vẻ trực quan.
Bạn có thể sao chép rõ ràng bên trong cơ thể lambda của mình nhưng tôi đoán đó không phải là những gì bạn đang tìm kiếm. Tất nhiên bạn có thể lấy tham chiếu giá trị r làm tham số cho nó là C++ 11. – CashCow
Câu hỏi là gì? – chill
@chill Đây là câu hỏi: tại sao đối tượng foo được sao chép bên trong lambda là const? –