从函数main调用时对未初始化的成员变量myMap的使用
最小可复现示例(MRE):
#include <unordered_map>
#include <string>
class MyClass {
private:
std::unordered_map<std::string, int> myMap;
public:
MyClass()
: myMap() {}
};
int main()
{
// Create a MyClass object on the heap
const auto* my_class = new MyClass();
delete my_class;
}
我难以理解为什么会有这个警告(在CLion)
Usage of non-initialized class field 'myMap' when called from function 'main'
我甚至在初始化列表中加入myMap以防万一,但没用。奇怪的是,一旦设定容量,警告就会消失。
证明
我有
set(CMAKE_CXX_STANDARD 23)
在我的CMakeLists.txt中
和
cmake_minimum_required(VERSION 3.30)
在栈上创建对象也会在CLion中产生相同的警告:
#include <unordered_map>
#include <string>
class MyClass {
private:
std::unordered_map<std::string, int> myMap;
public:
MyClass()
: myMap() {}
};
int main()
{
const MyClass my_class{};
}
解决方案
IDE的警告是一个 误报,因为 new MyClass() 将导致值初始化,而这在这里将使用默认构造函数,默认构造函数已经通过成员初始化列表正确初始化数据成员 myMap。
在第二种情况中,你也使用 const MyClass my_class{};,我们有列表初始化,在这种情况下也会使用默认构造函数,因此这里的 myMap 数据成员也被初始化。
我们100% 确定这是误报吗?
是的。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

