Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用显式析构函数和std::unique_ptr<&燃气轮机;会员可以';t不能用于std::vector<>;?_C++_C++11_Move Semantics - Fatal编程技术网

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
    的复制构造函数?这里的一切不都应该通过移动语义发生吗

  • 如果我删除析构函数,为什么它(复制构造函数)不会被隐式删除


显式析构函数声明(和定义)禁止移动构造函数和移动赋值运算符的隐式声明。因此,唯一可以使用的是copy构造函数(无论发生什么情况,它都会隐式声明),但它被定义为deleted,因为
unique\u ptr
s是不可复制的。因此出现了错误

显式默认它们-以及默认构造函数,因为您现在有一个用户声明的构造函数:

Foo() = default;
Foo(Foo&&) = default;
Foo& operator=(Foo&&) = default;
如果我删除析构函数,为什么它(复制构造函数)不会被隐式删除

它仍然被隐式删除。但由于现在隐式声明了移动构造函数,因此可以使用移动构造函数进行移动,而不使用复制构造函数


相关标准报价(§12.8[类别副本]/p9,20,增加强调):

9如果类
X
的定义未明确声明移动 构造函数,则仅当且仅当 如果

  • X
    没有用户声明的复制构造函数
  • X
    没有用户声明的复制分配运算符
  • X
    没有用户声明的移动分配运算符,并且
  • X
    没有用户声明的析构函数
20如果类
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;
};