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
相关产品推荐
相关产品推荐

