逗号运算符无法更新基类构造的输入参数
comma operator failed to update the input parameter for the base class construction
我有以下代码,它利用了初始化列表中的逗号运算符。
#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
之前执行,因此它会在 a
和 b
的值递增之前看到它们。
- C++11, §12.6.2/10:
在非委托构造函数中,初始化按以下顺序进行:
- 首先,并且仅对于派生最多的类 (1.8) 的构造函数,虚拟基类按照它们在基类的有向无环图的深度优先从左到右遍历上的顺序进行初始化,其中"从左到右"是基类在派生类基说明符列表中的出现顺序。
- 然后,直接基类按照它们出现在基说明符列表中的声明顺序进行初始化(无论 mem 初始值设定项的顺序如何)。
- 然后,非静态数据成员按照它们在类定义中声明的顺序进行初始化(同样,无论 mem 初始值设定项的顺序如何)。
- 最后,执行构造函数主体的复合语句。
相关文章:
- 将输入参数作为右值引用传递?
- 是否可以在命令行中将输入参数传递给可执行文件
- C++基于输入参数的动态代码生成
- 我想知道为什么"std::unique_ptr<int> foo(新 int)"是合法的,因为"std::<int>unique_ptr"要求输入参数类型应该是"int"?
- 如何使用输入参数作为文件的传递?
- 在函数中使用运算符重载,在 c++ 中使用 const 类型输入参数
- 提供变量作为 MATLAB 系统命令的输入参数,以便C++可执行文件
- 函数的函数无法识别输入参数
- 当迭代器(输入参数)通常不是constexpr时,constexpr算法真的有用吗
- 如何将一个使用参数包和typename的类作为函数(c++)的输入参数
- CvMat:输入参数的大小不匹配
- 在什么情况下,使用'const T*'输入参数比'const T&'更可取?
- std::具有两个输入参数的矢量构造函数
- GoogleMock:如何根据另一个输入参数设置ArgReferee?
- 模板化函数以从输入参数推断返回类型 stl-container
- GoogleMock:如何验证输入参数的调用次数?
- 当我将 char 数组发送到输入参数为字符串的函数时会发生什么?
- 应该接受不同输入参数的纯虚函数 - 应该如何实现
- C++主函数的输入参数
- STD :: Atomic_fetch为什么将指针作为其输入参数