C++ 使用显式析构函数和std::unique_ptr<&燃气轮机;会员可以';t不能用于std::vector<>;?
此代码C++ 使用显式析构函数和std::unique_ptr<&燃气轮机;会员可以';t不能用于std::vector<>;?,c++,c++11,move-semantics,C++,C++11,Move Semantics,此代码 #include <memory> #include <vector> class Foo { public: ~Foo() { } std::unique_ptr<int> bar; }; int main() { std::vector<Foo> foos; foos.emplace_back(); } 为什么要调用Foo的复制构造函数?这里的一切不都应该通过移动语义发生吗 如果
#include <memory>
#include <vector>
class Foo
{
public:
~Foo()
{
}
std::unique_ptr<int> bar;
};
int main()
{
std::vector<Foo> foos;
foos.emplace_back();
}
- 为什么要调用
的复制构造函数?这里的一切不都应该通过移动语义发生吗Foo
- 如果我删除析构函数,为什么它(复制构造函数)不会被隐式删除
unique\u ptr
s是不可复制的。因此出现了错误
显式默认它们-以及默认构造函数,因为您现在有一个用户声明的构造函数:
Foo() = default;
Foo(Foo&&) = default;
Foo& operator=(Foo&&) = default;
如果我删除析构函数,为什么它(复制构造函数)不会被隐式删除
它仍然被隐式删除。但由于现在隐式声明了移动构造函数,因此可以使用移动构造函数进行移动,而不使用复制构造函数
相关标准报价(§12.8[类别副本]/p9,20,增加强调): 9如果类
X
的定义未明确声明移动
构造函数,则仅当且仅当
如果
没有用户声明的复制构造函数X
没有用户声明的复制分配运算符X
没有用户声明的移动分配运算符,并且X
没有用户声明的析构函数X
X
的定义未明确声明移动
赋值运算符,如果
除非
没有用户声明的复制构造函数X
没有用户声明的移动构造函数X
没有用户声明的复制分配运算符,并且X
没有用户声明的析构函数X
Foo
不可复制,因为它有一个成员unique\u ptr
Foo
也是不可移动的,因为用户提供的析构函数声明会抑制默认移动构造函数/赋值的隐式生成。如果希望Foo
可移动,则默认移动构造函数/赋值,以便编译器为您生成它们:
class Foo
{
public:
~Foo()
{
}
Foo(Foo&&) = default;
Foo& operator=(Foo&&) = default;
std::unique_ptr<int> bar;
};
class-Foo
{
公众:
~Foo()
{
}
Foo(Foo&&)=默认值;
Foo&operator=(Foo&&)=默认值;
std::唯一的ptr条;
};
Foo() = default;
Foo(Foo&&) = default;
Foo& operator=(Foo&&) = default;
class Foo
{
public:
~Foo()
{
}
Foo(Foo&&) = default;
Foo& operator=(Foo&&) = default;
std::unique_ptr<int> bar;
};