编译警告:当对包含向量的嵌套结构使用列表初始化时,Vector _M_end_of_storage 可能会在未初始化的情况下使用

问题描述 投票:0回答:0

当我尝试使用列表初始化来初始化包含向量的嵌套结构时,我注意到了这个警告。虽然代码在运行时似乎按预期执行,但我不确定为什么在编译期间收到警告。我希望代码能够在没有警告的情况下编译。每个结构体的每个成员都正在初始化。

这是我设法将代码缩短为的最小可重现示例:

#include <vector>

struct Bottom {
    int bottom_int;
    std::vector<int> bottom_vec;
};

struct Top {
    Bottom bottom;
    std::vector<int> top_vec;
};

int main() {

    Top top{

        {1, {2}},

        {3}};

    return 0;
}

这是我收到的警告全文:

D:/cpp/tools/mingw64/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_vector.h:367:31: warning: 'top.Top::bottom.Bottom::bottom_vec.std::vector<int, std::allocator<int> >::<unnamed>.std::_Vector_base<int, std::allocator<int> >::_M_impl.std::_Vector_base<int, std::allocator<int> >::_Vector_impl::<anonymous>.std::_Vector_base<int, std::allocator<int> >::_Vector_impl_data::_M_end_of_storage' may be used uninitialized [-Wmaybe-uninitialized]

使用

-O3
-std=c++20
-std=c++23
(当然还有
-Wall
)编译时,我收到警告。我正在 Windows 10 上使用 g++ 13.1.0 进行编译。

我尝试阅读矢量的源代码,但我对它不够熟悉,无法理解为什么收到警告。我也尝试过查找,但结果似乎都不适合我的情况。

奇怪的是,稍加修改似乎就会使警告消失。在

bottom
中切换
top_vec
Top
的顺序(当然还要更改初始化顺序)可以使其编译时不会发出警告,就像将
{1, {2}},
更改为
Bottom{1, {2}},
一样,尽管这些更改应该没有意义。

如果有人能解释为什么我收到此警告(即使我的代码似乎没有做任何非凡的事情),我将不胜感激。此时我认为这可能是一个编译器错误。

c++ g++ stdvector
© www.soinside.com 2019 - 2024. All rights reserved.