You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在constexpr函数中解引用std::shared_ptr?

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 13:35:01