首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++移动构造函数,删除和省略,何时用户定义复制ctor?

C++移动构造函数,删除和省略,何时用户定义复制ctor?
EN

Stack Overflow用户
提问于 2021-05-20 00:11:21
回答 1查看 83关注 0票数 0

我有一些关于C++移动构造函数的简单问题,但是到目前为止还没有找到一篇专门解释我在下面看到的.

代码语言:javascript
复制
#include <utility>

class A
{
public:
    A() {}
    A(const A &) { std::cout << "copy Ctor" << std::endl; }
    A(A&&) { std::cout << "move Ctor" << std::endl; }
};

int main()
{
    A a;
    A b(std::move(a));
}

输出是

代码语言:javascript
复制
move Ctor

如果我显式删除移动构造函数,

代码语言:javascript
复制
    // A(A&&) { std::cout << "move Ctor" << std::endl; }
    A(A&&) = delete;

我有编译错误,

代码语言:javascript
复制
error: use of deleted function ‘A::A(const A&&)’

到目前一切尚好。

然后我读到,我认为‘不声明’应该会给出同样的结果,而不是显式删除,

代码语言:javascript
复制
    // A(A&&) { std::cout << "move Ctor" << std::endl; }
    // A(A&&) = delete;

但我得到了这个输出,

代码语言:javascript
复制
copy Ctor

现在我很困惑,

  1. 当我省略移动ctor的声明时,A b(std::move(a))是否直接调用复制ctor?这是C++标准的一部分吗?对于常规函数来说,这似乎是正确的--当函数的参数为xvalue时,采用rvalue引用的函数是首选的,而回退则是采用const lvalue reference.
  2. But,的函数,如果“移动构造函数在有用户定义的复制ctors时不是自动生成的”,为什么“显式删除”vs“不声明”会产生影响?

EN

回答 1

Stack Overflow用户

发布于 2021-05-20 01:03:30

为了使它更容易理解,我将使用一个不相关的示例,在这个示例中,预期的行为可能会更清楚一些。

与删除常规函数没有太大不同:

代码语言:javascript
复制
struct A
{
    void f(int i) {}
    void f(double d) = delete;
};

A a;
a.f(1.1); // Error

如果我们注释掉第二个重载,那么第一个将被使用。

很明显,它是一种有意的行为,因为删除函数的目的是确保它不被调用(如果它比另一个重载更匹配的话)。

因此,在我上面的示例中,可以很容易地防止发生一些不希望发生的转换。

在需要公共访问时,Thyis与将函数设置为私有没有太大不同。删除函数有一个额外的好处,即不能从类成员函数中使用它。另一个好处是错误发生在编译时,而不是链接时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67612386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档