You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GCC触发-Wuninitialized警告是否合理?

关于C++自定义空构造函数下对象成员值的未定义行为判定问题

初始代码示例

#include <array>
#include <cstddef>
#include <new>

struct Data
{
    //Data() {} // TODO
    int value;
};

auto test()
{
    alignas(Data) std::array<std::byte, sizeof(Data)> buffer;
    buffer.fill(std::byte{0xFF});
    auto* const p = new(buffer.data()) Data;
    const auto value = p->value;
    p->~Data();
    return value;
}

我对这段代码的预期行为:

  • 创建一个对齐正确、大小为sizeof(Data)的缓冲区,并填充0xFF
  • 在缓冲区中构造Data对象但不初始化任何成员值
  • Data对象会保留缓冲区原有的内存数据
  • 通常情况下test()函数会返回-1

使用最新版本的GCC、Clang、MSVC编译器(C++17标准)编译时,三者的表现都符合预期。

添加空构造函数后的情况

当取消注释Data的空构造函数后,代码变为:

struct Data
{
    Data() {} // TODO
    int value;
};

此时Clang和MSVC的表现与之前一致,但GCC会触发-Wuninitialized警告,生成的代码返回0而非-1,似乎将这段代码判定为未定义行为。

疑问

请问GCC判定该代码为未定义行为并触发-Wuninitialized警告是否正确?还是Clang和MSVC的判定才是正确的?

内容的提问来源于stack exchange,提问作者Adam Badura

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 07:33:14