c++cppcheckmember-initialization

cppcheck: member variable not initialized in the constructor


The following code, as far as I can tell, correctly initializes the variables of the derived class B:

#include <utility>

struct A {
  int i;
};

struct B : A {
  int j;
  explicit B(A&& a) : A(std::move(a)), j{i} { }
};

int main()
{
  A a{3};
  B b(std::move(a));

  return 0;
}

Running cppcheck with --enable=all gives the warning:

[test.cpp:9]: (warning) Member variable 'A::i' is not initialized in the constructor. Maybe it should be initialized directly in the class A?

Is there a reason for this (false, I think) warning?


Solution

  • Yes, this looks like a false positive. Base class subobjects are initialized before direct member subobjects and A(std::move(a)) will use the implicit move constructor which initializes this->i with a.i, so this->i will be initialized before the initialization of this->j is performed (which reads this->i).

    The argument given to the constructor in main is also completely initialized via aggregate initialization, so a.i's value will not be indeterminate either.