【发布时间】:2021-03-10 23:06:32
【问题描述】:
考虑下面的代码
#include <iostream>
template<typename Value>
struct Wrapper {
Value m_value;
Wrapper() {}
Wrapper(const Wrapper<Value> ©_from) : m_value(copy_from.m_value) {}
};
template<typename Value>
struct DefaultContainer {
Value m_default;
DefaultContainer(const Value& def) : m_default(def) {}
};
template<typename Value>
struct DefaultContainerUser : public DefaultContainer<Value> {
DefaultContainerUser() : DefaultContainer<Value>(Value()) {}
};
int main() {
DefaultContainerUser<Wrapper<double>> user;
std::cout << user.m_default.m_value << std::endl;
}
当我用 c++ -O1 -Werror -Wall test.cpp 编译它时,我收到以下错误:
test.cpp: In function ‘int main()’:
test.cpp:8:63: error: ‘<anonymous>.Wrapper<double>::m_value’ is used uninitialized in this function [-Werror=uninitialized]
8 | Wrapper(const Wrapper<Value> ©_from) : m_value(copy_from.m_value) {}
| ~~~~~~~~~~^~~~~~~
cc1plus: all warnings being treated as errors
如果我使用-O0 禁用优化,一切正常。添加 -Wno-error=maybe-uninitialized 优化仍然打开并没有帮助。我在这里做错了什么?
我使用的编译器是c++ (GCC) 10.2.1 20201016 (Red Hat 10.2.1-6)。
【问题讨论】:
-
copy_from.m_value在哪里初始化? -
啊,你是对的,将默认构造函数更改为
Wrapper() : m_value() {}可以解决问题。有时您只需要有人重新阅读错误消息给您。但是为什么我只有在开启优化的情况下才会报错呢? -
我猜这是 UB 的结果——它会以不可预知的方式出现。
-
一些调试版本会将内存初始化为零,这可能会干扰未初始化的使用检测。
标签: c++ initialization compiler-optimization temporary-objects