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
相关产品推荐
相关产品推荐

