委派的 ctor 是否受参数计算顺序的影响?
Are delegated ctors affected by argument evaluation order?
最多 C++函数参数中的求值顺序和 C++17 引入的评估顺序保证是什么? 委托 CTOR 是否受评估顺序的影响?
struct A
{
A( int a, int b ) : mA(a), mB(b) {}
A( std::vector<u8>::const_iterator& aBuffer ) :
A( CreateIntFromBuffer(aBuffer), CreateIntFromBuffer(aBuffer) ) {}
};
我需要再次使用mA
和mB
的名字重复我自己吗?
c++XX标准之间有一些区别吗?
[class.base.init]
7 mem初始值设定项中的表达式列表或大括号初始化列表是 用于初始化指定的子对象(或者,在 委托构造函数,完整的类对象(根据 用于直接初始化的 [dcl.init] 的初始化规则。
[dcl.init]
19 如果初始值设定项是带括号的表达式列表,则 表达式按为函数调用指定的顺序计算。
鉴于上述两段,我得出的结论是,评估的顺序在...
A( CreateIntFromBuffer(aBuffer), CreateIntFromBuffer(aBuffer) )
。的两个调用未指定(除了不交错(。因此,您不能依赖左调用在右调用之前完成,反之亦然。
可以使用大括号初始化列表来强制从左到右的评估顺序,例如...
A{ CreateIntFromBuffer(aBuffer), CreateIntFromBuffer(aBuffer) }
。但我至少会称它为大括号初始化的某种晦涩使用。考虑重构。
在紧要关头,可以使用返回A
的命名函数,并委托给复制/移动构造函数:
struct A
{
static A makeA(std::vector<u8>::const_iterator& aBuffer) {
int a = CreateIntFromBuffer(aBuffer);
int b = CreateIntFromBuffer(aBuffer);
return A(a,b);
}
A( int a, int b ) : mA(a), mB(b) {}
A( std::vector<u8>::const_iterator& aBuffer ) : A(makeA(aBuffer)) {}
};
由于保证了复制省略,这实际上不会涉及任何副本。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- CMake-按正确顺序将项目与C运行时对象文件链接
- 函数调用中参数的顺序重要吗
- 为什么不;名字在地图上是按顺序排列的吗
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 数到第n个楼梯的路(顺序无关紧要)
- 委派的 ctor 是否受参数计算顺序的影响?
- 影响初始化顺序(以C++为单位)
- 与任何算术操作员都会影响优化的恒定操作数顺序
- 添加字符串和文字,顺序如何影响是否可以正确添加字符串
- 联接线程如何影响主线程中的执行顺序?
- C :使用声明和指令的顺序会影响选择
- 文件范围的原子是否受初始化顺序惨败的影响
- 为什么继承顺序或映射会影响 vftable 的下标?(对于 VSC 表示C++)
- 继承顺序C++以何种方式影响构造函数
- 为什么 clang 编译器标志的顺序会影响生成的二进制大小
- 重载逗号操作符真的会影响其操作数的求值顺序吗?
- 为什么改变这些指令的顺序会显著影响性能
- 类属性的顺序会影响对象的大小吗?
- C++-为什么插入类型的顺序会影响Vector性能(GCC 4.81)