以下代码无法编译(至少在我尝试过的g ++ / clang版本中)。 godbolt link
struct T {
std::unique_ptr<double> p;
T() {}
T(const T&) {}
T(T&&) {}
};
struct X {
T t;
std::vector<std::unique_ptr<int>> f;
};
int main()
{
std::vector<X> y;
X x;
y.emplace_back(std::move(x));
}
具体来说,编译器似乎抱怨在vector<unique_ptr<int>>
上调用已删除的副本构造函数,这对我来说没有意义。
requirements似乎或多或少说emplace_back
应该在移动构造函数中起作用。由于没有X
的用户声明的构造函数,也没有无法移动的成员/基类,因此我认为move构造函数应隐式声明而不删除。
一些“修正”:
有人可以解释为什么原始代码格式错误吗?以及为什么“修复程序”(通常是前3个,尤其是第3个)使代码可以编译?