cppcheck: 成员变量未在构造函数中初始化
cppcheck: member variable not initialized in the constructor
据我所知,以下代码正确初始化了派生的变量 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;
}
运行 cppcheck 和 --enable=all
给出警告:
[test.cpp:9]: (warning) Member variable 'A::i' is not initialized in
the constructor. Maybe it should be initialized directly in the class
A?
这个(我认为是假的)警告有什么原因吗?
是的,这看起来像是误报。基础 class 子对象在直接成员子对象之前初始化,并且 A(std::move(a))
将使用隐式移动构造函数,它使用 a.i
初始化 this->i
,因此 this->i
将在执行 this->j
的初始化(读取 this->i
)。
main
中构造函数的参数也是通过聚合初始化完全初始化的,所以a.i
的值也不会不确定。
据我所知,以下代码正确初始化了派生的变量 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;
}
运行 cppcheck 和 --enable=all
给出警告:
[test.cpp:9]: (warning) Member variable 'A::i' is not initialized in the constructor. Maybe it should be initialized directly in the class A?
这个(我认为是假的)警告有什么原因吗?
是的,这看起来像是误报。基础 class 子对象在直接成员子对象之前初始化,并且 A(std::move(a))
将使用隐式移动构造函数,它使用 a.i
初始化 this->i
,因此 this->i
将在执行 this->j
的初始化(读取 this->i
)。
main
中构造函数的参数也是通过聚合初始化完全初始化的,所以a.i
的值也不会不确定。