委派的 ctor 是否受参数计算顺序的影响?

Are delegated ctors affected by argument evaluation order?

本文关键字:顺序 影响 计算 ctor 是否 委派 参数      更新时间:2023-10-16

最多 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) ) {}
};

我需要再次使用mAmB的名字重复我自己吗?

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)) {}
};

由于保证了复制省略,这实际上不会涉及任何副本。