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

为何folly::future中BrokenPromise的const char*构造函数被声明为explicit?

为什么folly::BrokenPromise的const char*构造函数要声明为explicit?

我在Facebook的folly::future库中发现了BrokenPromise的定义,无法理解此处将BrokenPromise(const char* type)构造函数声明为explicit的用意,请问这是否有必要?

相关代码如下:

class FOLLY_EXPORT BrokenPromise : public PromiseException {
 public:
  explicit BrokenPromise(const std::string& type)
      : PromiseException("Broken promise for type name `" + type + '`') {}
  explicit BrokenPromise(const char* type) : BrokenPromise(std::string(type)) {}
};

这个explicit声明绝对是有必要的,主要有两个核心原因:

  • 保持构造行为的一致性
    你看,另一个接受const std::string&的构造函数已经被标记为explicit了——这意味着不能从std::string隐式转换出BrokenPromise对象。如果这个const char*版本不加上explicit,就会出现逻辑矛盾:直接传std::string对象时必须显式构造,但传字符串字面量时编译器却能自动隐式转换为BrokenPromise。这种不一致的行为会让开发者困惑,也不符合类的设计意图。把两个单参数构造都标记为explicit,能确保所有场景下都必须显式构造BrokenPromise,避免奇怪的行为差异。

  • 防止意外的隐式转换
    BrokenPromise是异常类型,我们通常只会在主动抛出异常时显式构造它(比如throw BrokenPromise("MyType");)。如果允许const char*隐式转换为BrokenPromise,可能会出现意外情况:比如某个函数接受BrokenPromise作为参数时,开发者不小心传入字符串字面量,编译器会默默构造异常对象,这大概率不是开发者的预期。explicit强制开发者显式写出构造逻辑,能避免这类无意识的错误。

总的来说,这个explicit是为了维护类的设计一致性,同时防止不必要的隐式转换带来的意外行为,完全符合C++中explicit关键字的最佳实践。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:53:58