复制省略和琐碎的可复制类型



从标准6.7.7(临时对象(中,我们可以看到:

当类类型X的对象被传递到函数或从函数返回时,如果X至少有一个合格的复制或移动构造函数([special](,每个这样的构造函数都是平凡的,并且X的析构函数是平凡的或已删除的,则允许实现创建一个临时对象来保存函数参数或结果对象。临时对象分别由函数参数或返回值构造而成,函数的参数或返回对象被初始化,就好像使用合格的平凡构造函数来复制临时对象一样(即使该构造函数不可访问,或者重载解析不会选择该构造函数来执行对象的复制或移动(。[注4:允许类类型的对象被传递到寄存器中的函数或从寄存器中返回。--结束注释]

这是否意味着对于微不足道的可复制类型,复制省略不是强制性的?我在这里所理解的是,如果我们声明一个像~Object() {}这样的析构函数,而不是不声明任何东西(因此析构函数将由编译器生成(或默认的析构因子,那么对象就变得不可构造,因此,必须执行复制省略(在我们尊重发生复制省略的众所周知的条件下(。

这是否意味着复制省略对于普通的可复制类型不是强制性的

原则上是的,但您引用的部分的目标不是免除POD类型的复制省略,而是绕过ABI对函数调用中如何传递对象的限制。它允许POD对象通过寄存器传递。考虑到C++抽象机器对物理机器及其寄存器和调用约定一无所知,这是标准所能做的最好的事情。

有保证的拷贝省略是贯穿整个标准的几个更改的结果,其中包括延迟的prvalue物化。有关详细信息,请参阅原始提案p0135r1。

有了这些更改,就有可能(并且需要(在不涉及临时性的情况下初始化对象([dcl.init.general]/15.6.1(:

否则,如果目标类型是cv合格(类别类型:

  • 如果初始值设定项表达式是prvalue,并且源类型的cv不合格版本与类,初始化器表达式用于初始化目标对象

最新更新