sha*_*oth 5 c++ copy-constructor rvo nrvo
我无法理解RVO(和NRVO)的定义,因为像我这样的多个问题,假设RVO省略了复制构造函数.现在根据12.8.15
在这种情况下,实现将省略的复制操作的源和目标视为仅仅两种不同的引用同一对象的方式,并且该对象的销毁发生在两个对象被销毁的时间的晚期.优化.
看起来它不是复制构造函数调用被省略,但复制本身 - 只是对象是在第一个位置的"复制"位置构建的,所以没有"原始"对象,根本没有复制.因此,即使一个类有一个private复制构造函数,它也可以在RVO启动时从函数返回,因为没有复制.
我做对了吗?复制本身是省略还是复制构造函数invokation被省略?当对象类有私有拷贝构造函数时,是否应该允许从函数返回一个对象?
复制本身是省略还是复制构造函数invokation被省略?
复制操作本身被省略.如果您看一下完整的报价,它会清楚地提到:
C++ 03 12.8复制类对象
第15段
当满足某些条件时,允许实现省略类对象的复制结构,即使该对象的复制构造函数和/或析构函数具有副作用.在这种情况下,实现将省略的复制操作的源和目标简单地视为引用同一对象的两种不同方式,并且该对象的销毁发生在两个对象的后期时间.在没有优化的情况下销毁.111)在下列情况下允许复制操作的省略(可以合并以消除多个副本):
- 在具有类返回类型的函数的return语句中,当表达式是具有与函数返回类型相同的cv-unqualified类型的非易失性自动对象的名称时,通过构造自动化可以省略复制操作对象直接进入函数的返回值.
- 当一个未绑定到引用(12.2)的临时类对象被复制到具有相同cv-nonqualified类型的类对象时,可以通过将临时对象直接构造到省略的目标中来省略复制操作复制.....
当对象类有私有拷贝构造函数时,是否应该允许从函数返回一个对象?
RVO和NRVO是编译器优化,编译器允许但不保证如果特定的哑编译器无法提供这些优化会发生什么?
如果没有可访问的复制构造函数,代码将在所有不需要的编译器上中断.鉴于复制构造函数应该是可访问的.
官方说法是,不,RVO/NRVO 不会影响程序的结构是否良好。标准明确允许忽略复制构造函数的任何副作用,但仍然应该对复制构造函数进行访问检查。
然而,大多数编译器不会对省略的复制构造函数进行访问检查,除非您要求尽可能严格地执行规则。我不太确定,但我似乎记得使用过一些跳过访问检查的方法,即使您确实要求严格遵守(但我不确定)。
编辑(纠正我认为其他一些答案中表达的误解):
标准章节中的段落应按顺序阅读。第一段中适用于某种情况的要求始终适用。在这种情况下,允许省略副作用的是第 15 段。然而,在紧接其之前的第 14 段中,我们看到:
如果隐式使用对象的复制构造函数或复制赋值运算符并且特殊成员函数不可访问(第 11 条),则程序是格式错误的。
因此,如果第 14 段中指定的访问检查已经通过,我们只能到达第 15 段(其中可以省略复制) 。
| 归档时间: |
|
| 查看次数: |
398 次 |
| 最近记录: |