背景
在某个class中定义了static constexpr size_t value
变量,调用如下:
std::vector<std::pair<size_t, size_t>> vec;
vec.push_back({0, value});
release编译可以通过,debug编译时报错Undefined reference to XXX::value
。
分析
对于gcc而言constexpr
变量属于compile time const是不存在地址的,
任何取值不涉及地址的操作都是ok的,一旦涉及地址便产生了ORD-use (见参考文档),
而std::vector::push_back()
在C++11后默认会调用move方法,故产生错误。
相对于debug更高优化等级(-O2及以上)的release编译,gcc自动优化了该调用方法故不报错。
解决
定义一个临时常量可以解决
const std::pair<size_t, size_t> pair{0, value};
vec.push_back(pair);
或者使用cast实现拷贝
vec.push_back({0, (size_t)value});
参考
c++ - What does it mean to "ODR-use" something? - Stack Overflow