能否在constexpr函数中解引用std::shared_ptr?
C++17及更早版本:无法实现
在C++20之前,std::shared_ptr的核心成员函数(包括operator->、operator*、get())都不是constexpr的。而constexpr函数要求内部调用的所有函数必须符合常量表达式要求,因此直接在constexpr函数内部解引用shared_ptr会触发编译错误。这种情况下,你只能在传入函数前先解引用shared_ptr,再将对象的引用或指针传入函数。
C++20及以后版本:有限制地支持
C++20标准为std::shared_ptr添加了部分constexpr支持,但有严格的使用限制:
- 只能指向静态存储期的对象(比如全局变量、
static局部变量),或者nullptr; - 不能指向动态分配的对象(比如通过
new或std::make_shared创建的对象,因为constexpr上下文对动态内存的管理仍有诸多限制,shared_ptr无法在编译期安全处理这类内存的释放)。
满足上述条件时,你可以在constexpr函数内部正常解引用shared_ptr,示例代码如下:
#include <memory> struct Type { bool some_bool = true; }; static Type global_obj; // 静态存储期对象 constexpr bool test(std::shared_ptr<Type>& val) { return val->some_bool; } constexpr bool demo() { std::shared_ptr<Type> ptr(&global_obj); // constexpr构造,指向静态对象 return test(ptr); } static_assert(demo() == true); // 编译期验证通过
总结
- C++17及更早:必须在传入函数前解引用
shared_ptr,无法在函数内部完成; - C++20及以后:仅当
shared_ptr指向静态存储期对象或nullptr时,才能在constexpr函数内部解引用,动态分配对象的场景仍不支持。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

