25 c++ boost move-semantics c++11 boost-optional
我一直试图在一个带有boost::optional
成员变量的类中定义一个默认的移动构造函数.
#include <boost/optional.hpp>
#include <utility>
#include <vector>
struct bar {std::vector<int> vec;};
struct foo {
foo() = default;
foo(foo&&) = default;
boost::optional<bar> hello;
};
int main() {
foo a;
foo b(std::move(a));
}
Run Code Online (Sandbox Code Playgroud)
我的编译器支持移动语义和默认的移动构造函数,但我不能让它工作.
Run Code Online (Sandbox Code Playgroud)% clang++ foo.cc -std=c++11 -stdlib=libc++ foo.cc:15:7: error: call to deleted constructor of 'foo' foo b(std::move(a)); ^ ~~~~~~~~~~~~ foo.cc:9:3: note: function has been explicitly marked deleted here foo(foo&&) = default; ^ 1 error generated.
有没有办法移动a boost::optional
而不修改Boost的源代码?或者我应该等到Boost支持移动?
我过去遇到了同样的问题boost::any
.
Max*_*kin 18
查看boost::optional
源代码,它不定义移动构造函数或移动赋值.但是,它确实定义了复制构造函数和赋值,这会阻止编译器自动生成移动构造函数和赋值.
请参阅移动构造函数 - 问答:
编译器将隐式生成移动构造函数作为成员移动,除非您已明确定义了复制构造函数或复制/移动赋值或析构函数
正如吕克丹顿所暗示的那样,需要解决这个问题.让我们尝试使用swap
,boost::optional
希望创建一个空boost::optional
便宜,然后我们只是将默认构造boost::optional
与r值中的一个交换foo
,例如:
foo(foo&& b) {
hello.swap(b.hello);
}
Run Code Online (Sandbox Code Playgroud)
移动任务也一样.
归档时间: |
|
查看次数: |
6500 次 |
最近记录: |