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

std::make_shared是否会忽略构造函数的explicit说明符?

问题原理说明
  • explicit关键字仅禁止构造函数参与隐式类型转换流程,不会限制显式调用构造函数的场景:
    • Foo(1)编译失败属于典型的隐式转换触发的拦截:编译器需要自动将int类型的参数1转换为A类对象,刚好命中explicit的限制规则,这完全符合你给构造函数加explicit的设计预期。
    • std::make_shared<A>(x)能正常执行的原因是,make_shared内部会把传入的参数直接透传给A的构造函数,走的是显式调用构造的逻辑,效果等价于你直接写A(x),这种场景本来就不受explicit的约束,因此运行完全正常。

补充验证:你写A a = 1;会触发隐式转换编译失败,但是写A a(1);显式构造就会正常编译,和make_shared的逻辑完全一致。

使用合理性判断

你的使用方式没有任何问题。你给A的构造加explicit的目的是避免非预期的隐式类型转换,而通过make_shared创建A对象是你主动发起的显式构造操作,完全符合设计预期,不存在安全隐患。


内容的提问来源于stack exchange,提问作者RoQuOTriX

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 00:48:05