考虑以下代码片段,其中我有一个仅移动Wrapper
对象,该对象在构造时将参数转发给基础数据。现在,如果我在另一个仅移动的类(在这种情况下为Wrapper
)中使用此SomeObject
对象,除非SomeObject
的移动构造函数是默认的,否则它不会编译。< / p>
#include <utility>
template <typename T> class Wrapper {
public:
template <typename... Args>
Wrapper(Args &&... args) : _data{std::forward<Args>(args)...} {}
Wrapper(const Wrapper &) = delete;
Wrapper(Wrapper &&other) : _data(std::move(other)) {}
T &get() const { return _data; }
protected:
T _data;
};
struct SomeObject {
SomeObject(const SomeObject &) = delete;
SomeObject(SomeObject &&other) : x(std::move(other.x)) {}
//SomeObject(SomeObject &&other) = default; // this works!
SomeObject(int val) : x(val) {}
Wrapper<int> x;
};
int main() {
SomeObject obj(10);
return 0;
}
使用gcc 6.3我们得到:
test.cpp: In instantiation of ‘Wrapper<T>::Wrapper(Wrapper<T>&&) [with T = int]’:
test.cpp:20:56: required from here
test.cpp:10:52: error: cannot convert ‘std::remove_reference<Wrapper<int>&>::type {aka Wrapper<int>}’ to ‘int’ in initialization
Wrapper(Wrapper &&other) : _data(std::move(other)) {}
^
我在这里缺少什么吗? Aren用户在SomeObject
中提供的移动构造函数与编译器在默认时定义的构造函数相同吗?
我能找到的唯一接近这一点的是this answer,但我觉得这是一个不同的情况,因为SomeObject
的移动构造函数没有通过const
类型
答案 0 :(得分:1)
这是预期的。看看你的代码:
Wrapper(Wrapper &&other) : _data(std::move(other)) {}
T _data;
在你的情况下,T是int。您想如何从int
初始化Wrapper<int>
?