了解默认移动构造函数定义

曼托什·库玛

从当前标准中了解move构造函数时,我可以看到以下内容:

12.8复制和移动类对象

如果类X的定义未明确声明移动构造函数,则仅当且仅当将隐式声明为默认构造函数。

— X没有用户声明的副本构造函数,
— X没有用户声明的副本分配运算符,
— X没有用户声明的移动分配运算符,以及
— X没有用户声明的析构函数。

[注意:如果未隐式声明或未明确提供move构造函数,则原本会调用move构造函数的表达式可以改为调用copy构造函数。—尾注]

我认为注释部分明确提到默认移动构造函数的后备类型将是复制构造函数。为了理解这个概念,我编写了一个小程序来理解这个概念。

#include<iostream>
struct handleclass {
public:
   handleclass():length{0}, p{nullptr} {}
    handleclass(size_t l):length{l},p{new int[length]} { }  
    ~handleclass() { delete[] p; }
    size_t length;
    int* p;
 };

handleclass function(void) {
    handleclass x(10);
    return x;
}

int main() {
    handleclass y;
    std::cout<<y.length<<std::endl;
    y = function();
    std::cout<<y.length<<std::endl;   
    
   handleclass a;
   handleclass b(10);
   a = std::move(b);

    return 0;
}

显然,由于两个对象对资源的浅表复制,该程序是不正确的,并且具有未定义的行为(终止)。但是我的重点是了解在程序中生成和使用的默认move构造函数。我希望这个例子有意义。

在以上程序中,在两种情况下均应调用move构造函数时,在我看来编译器正在使用默认的拷贝构造函数。

基于标准中提到的上述规则,我认为我们应该遇到编译器错误,因为现在程序明确尝试调用move构造函数,并且用户没有实现,编译器也未生成default(隐式),因为上述规则不满足?

但是,此代码在没有任何警告/错误的情况下被编译并成功运行。有人可以解释一下默认(隐式)移动构造函数的概念吗?还是我错过了什么?

毫米

您会忘记复制省略,这意味着它y = function();实际上可能不会调用任何复制或移动构造函数。只是构造函数x和赋值运算符。

如该线程所述,某些编译器允许您禁用复制省略。

我不确定“在两种情况下都应调用move构造函数的情况”的含义。实际上,应该调用move构造函数的情况为零(您的对象没有move构造函数),而可以调用拷贝构造函数的情况(该return语句)却被忽略了。

您有两种情况的赋值运算符y = function();a = std::move(b);同样,由于您的班级没有移动分配运算符,因此它们将使用复制分配运算符。

如果您将代码cout从复制构造函数中添加到对象中并移动构造函数,则可能会帮助您进行测试

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

了解默认Move构造函数定义

来自分类Dev

默认移动构造函数

来自分类Dev

默认移动构造函数

来自分类Dev

默认移动构造函数

来自分类Dev

移动构造函数不能默认

来自分类Dev

默认移动构造函数Visual Studio 2015

来自分类Dev

默认移动构造函数和引用成员

来自分类Dev

带互斥成员的默认移动构造函数

来自分类Dev

移动构造函数-默认构造函数VS 2013的类型无效

来自分类Dev

用默认构造函数生成的C ++移动构造函数

来自分类Dev

为什么移动构造函数的成员需要默认构造函数?

来自分类Dev

了解移动构造函数,std :: move和析构函数

来自分类Dev

用户定义的构造函数和隐式默认构造函数

来自分类Dev

错误:已经定义了默认构造函数

来自分类Dev

我应该定义默认的构造函数吗?

来自分类Dev

定义的副本构造函数c ++的默认行为

来自分类Dev

用户定义和默认构造函数?

来自分类Dev

具有std :: string属性的默认移动构造函数行为

来自分类Dev

默认移动构造

来自分类Dev

了解构造函数

来自分类Dev

了解Promise构造函数

来自分类Dev

了解BigInteger构造函数

来自分类Dev

了解构造函数

来自分类Dev

构造函数中定义的类函数的默认参数

来自分类Dev

默认(用户定义)构造函数和带有默认参数的构造函数之间的区别?

来自分类Dev

具有移动构造函数和分配的类的默认副本构造函数和分配

来自分类Dev

在类体之外定义函数时,c ++派生的构造函数-“无默认构造函数”

来自分类Dev

用户定义的左值引用类型成员的移动构造函数

来自分类Dev

另一个类的移动构造函数中的移动类(没有默认构造函数)

Related 相关文章

热门标签

归档