为什么此Move构造函数不起作用

加布里埃尔

我有以下代码片段。有谁知道为什么在主函数中没有在所有情况下都调用此move构造函数?为什么仍然可以编译?分配运算符是私有的?此处的链接:http : //ideone.com/bZPnyY

#include <iostream>    
#include <vector>

class A{
public:
    A(int i){
        std::cout << "Constructor "<< i <<std::endl;
        for(int l = 0; l<i;l++){
            vec.push_back(l);
        }
    };

    A(A && ref): vec(std::move(ref.vec))
    {
       std::cout << "Move constructor"<<std::endl;
    }

    A & operator=(A && ref){
       if(this != &ref){
            vec = std::move(ref.vec);
       }
       std::cout << "Move assignment"<<std::endl;
       return *this;

    }

    std::vector<int> vec;

private:
    A(const A & ref);
    A(A & ref);
    A & operator=(A & ref);
};


A makeA(){
    A a(3);
    return a;
}

int main(){
    A b1(makeA()) ;
    A b2 = makeA();
    A b3 = A(3);
    A b4(A(3));
    std::cout << b4.vec[2] << std::endl;
};

输出:
构造函数3
构造函数3
构造函数3
构造函数3
2

响应中的一些补充:当我添加时

 std::pair<int,A> a(3,A(3));

然后调用move构造函数(因此,希望没有NRVO)

安德鲁·托马佐斯(Andrew Tomazos)

您所看到的称为复制省略,并记录在12.8.31中。

A makeA(){
    A a(3);
    return a;
}

A b1(makeA()) ;
A b2 = makeA();

在这里,a在局部变量makeA中的返回值直接布设makeA,并在转的临时返回值makeA是在存储直接布设b1b2(连续两个副本省略)

A b3 = A(3);
A b4(A(3));

使用创建的临时对象A(3)直接在b3和中构造b4(一个副本省略)

当满足某些条件时,即使为复制/移动操作选择的构造函数和/或对象的析构函数具有副作用,也允许实现忽略类对象的复制/移动构造。在这种情况下,实现将忽略的复制/移动操作的源和目标视为引用同一对象的两种不同方式,并且该对象的销毁发生在两个对象本来应该以较晚的时间发生。122在以下情况下允许复制/移动操作的这种省略,称为复制删除,(可以合并以消除多个副本):

这是b1andb2案例的第一部分

  • 在具有类返回类型的函数的return语句中,当表达式是具有与函数返回类型相同的cv非限定类型的非易失性自动对象(函数或catch子句参数除外)的名称时,通过将自动对象直接构造到函数的返回值中,可以省略复制/移动操作

这是的第二部分b1b2壳体,以及的整个部分b3b4壳体:

  • 当尚未绑定到引用(12.2)的临时类对象将被复制/移动到具有相同cv-unqualtype类型的类对象时,可以通过将临时对象直接构造到目标中来省略复制/移动操作省略的副本/移动的

还有两个其他允许复制省略的情况与抛出和捕获异常有关。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

c ++ 11为什么此move构造函数不起作用?

来自分类Dev

为什么LinearGradient构造函数的此参数似乎不起作用?

来自分类Dev

为什么这个构造函数不起作用?

来自分类Dev

为什么此递归函数不起作用

来自分类Dev

PHP-为什么此LIST函数不起作用

来自分类Dev

为什么此JavaScript mousemove函数不起作用?

来自分类Dev

为什么此setAttribute函数不起作用?

来自分类Dev

C函数屏蔽:为什么此示例不起作用?

来自分类Dev

为什么此Excel RIGHT函数不起作用?

来自分类Dev

为什么此setAttribute函数不起作用?

来自分类Dev

为什么此.slideToggle函数在jQuery中不起作用?

来自分类Dev

为什么我的函数的此签名不起作用?

来自分类Dev

为什么此javascript函数调用不起作用?

来自分类Dev

为什么此bash函数不起作用?

来自分类Dev

将构造函数分配给变量。-为什么使用Firefox控制台此代码不起作用

来自分类Dev

将构造函数分配给变量。-使用Firefox控制台,为什么此代码不起作用

来自分类Dev

为什么此NotificationListenerService不起作用

来自分类Dev

为什么此for循环不起作用?

来自分类Dev

为什么此查询不起作用?

来自分类Dev

为什么此XQuery不起作用?

来自分类Dev

为什么此聚合不起作用?

来自分类Dev

为什么此动画不起作用?

来自分类Dev

为什么此代码不起作用?

来自分类Dev

为什么此调度不起作用?

来自分类Dev

为什么此cronjob不起作用?

来自分类Dev

为什么此toggleClass()不起作用?

来自分类Dev

为什么此查询不起作用

来自分类Dev

为什么此函数不调用move构造函数?

来自分类Dev

为什么在构造函数内部的子元素中调用纯虚函数不起作用?

Related 相关文章

热门标签

归档