逗号运算符无法更新基类构造的输入参数

comma operator failed to update the input parameter for the base class construction

本文关键字:输入 参数 基类 更新 运算符      更新时间:2023-10-16

我有以下代码,它利用了初始化列表中的逗号运算符。

#include <iostream>
using namespace std;
class Base
{
    protected:
        int b;
    public:
        Base(int a):b(a){}
};
class A:public Base
{
    private:
        const int i;
        const int j;
        void inc(int & a, int & b) {a++; b++;}
    public:
        A(int a, int b):i((inc(a,b),a)),j(b),Base(a+b){}
        void print(){cout<<i<<" "<<j<<" "<<b<<endl;}
};
int main()
{
    A a(6,7);
    a.print();
    return 0;
}

我期待结果是:

7, 8, 15

但结果是:

7, 8, 13

似乎"a"和"b"在用于构造基类时没有递增。不知道为什么...

成员初始化列表中的项顺序控制成员初始化的顺序。首先初始化基类,然后按定义1 的顺序初始化派生类的成员。

由于基类是首先初始化的,因此Base(a+b)在调用 inc 之前执行,因此它会在 ab 的值递增之前看到它们。


  1. C++11, §12.6.2/10:

在非委托构造函数中,初始化按以下顺序进行:

  • 首先,并且仅对于派生最多的类 (1.8) 的构造函数,虚拟基类按照它们在基类的有向无环图的深度优先从左到右遍历上的顺序进行初始化,其中"从左到右"是基类在派生类基说明符列表中的出现顺序。
  • 然后,直接基类按照它们出现在基说明符列表中的声明顺序进行初始化(无论 mem 初始值设定项的顺序如何)。
  • 然后,非静态数据成员按照它们在类定义中声明的顺序进行初始化(同样,无论 mem 初始值设定项的顺序如何)。
  • 最后,执行构造函数主体的复合语句。