Mar*_*ard 29 c++ lambda c++11 c++14
我正在以这种方式捕获lambda表达式中的unique_ptr:
auto str = make_unique<string>("my string");
auto lambda = [ capturedStr = std::move(str) ] {
cout << *capturedStr.get() << endl;
};
lambda();
Run Code Online (Sandbox Code Playgroud)
它工作得很好,直到我尝试移动capturedStr到另一个unique_ptr.例如,以下内容不起作用:
auto str = make_unique<string>("my string");
auto lambda = [ capturedStr = std::move(str) ] {
cout << *capturedStr.get() << endl;
auto str2 = std::move(capturedStr); // <--- Not working, why?
};
lambda();
Run Code Online (Sandbox Code Playgroud)
这是编译器的输出:
.../test/main.cpp:11:14: error: call to implicitly-deleted copy
constructor of 'std::__1::unique_ptr<std::__1::basic_string<char>,
std::__1::default_delete<std::__1::basic_string<char> > >'
auto str2 = std::move(capturedStr);
^ ~~~~~~~~~~~~~~~~~~~~~~ ../include/c++/v1/memory:2510:31: note: copy constructor is implicitly
deleted because 'unique_ptr<std::__1::basic_string<char>,
std::__1::default_delete<std::__1::basic_string<char> > >' has a
user-declared move constructor
_LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&& __u) _NOEXCEPT
^ 1 error generated.
Run Code Online (Sandbox Code Playgroud)
为什么不能移动capturedStr?
T.C*_*.C. 54
该operator ()拉姆达的是const默认的,你不能从一个移动const物体.
mutable如果要修改捕获的变量,请声明它.
auto lambda = [ capturedStr = std::move(str) ] () mutable {
// ^^^^^^^^^^
cout << *capturedStr.get() << endl;
auto str2 = std::move(capturedStr);
};
Run Code Online (Sandbox Code Playgroud)
auto lambda = [ capturedStr = std::move(str) ] {
cout << *capturedStr.get() << endl;
auto str2 = std::move(capturedStr); // <--- Not working, why?
};
Run Code Online (Sandbox Code Playgroud)
为了提供更多细节,编译器正在有效地进行这种转换:
class NameUpToCompiler
{
unique_ptr<string> capturedStr; // initialized from move assignment in lambda capture expression
void operator()() const
{
cout << *capturedStr.get() << endl;
auto str2 = std::move(capturedStr); // move will alter member 'captureStr' but can't because of const member function.
}
}
Run Code Online (Sandbox Code Playgroud)
在lambda上使用mutable将从operator()成员函数中删除const,从而允许更改成员.
为了使建议更明确:添加mutable:http://coliru.stacked-crooked.com/a/a19897451b82cbbb
#include <memory>
int main()
{
std::unique_ptr<int> pi(new int(42));
auto ll = [ capturedInt = std::move(pi) ] () mutable { };
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10835 次 |
| 最近记录: |