Loading

C++探究Undefined reference to static constexpr

背景

在某个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

posted @ 2022-05-31 20:02  azureology  阅读(733)  评论(0)    收藏  举报