【问题标题】:Why double parameter constructor begins with an explicit keyword?为什么双参数构造函数以显式关键字开头?
【发布时间】:2013-07-12 23:07:07
【问题描述】:

我和我的伙伴最近一直在阅读 leveldb 源代码。我们遇到了这个问题。在leveldbdb/skiplist.h文件中,有一个构造函数声明:

explicit SkipList(Comparator cmp, Arena* arena);

我知道具有单个参数的显式构造函数意味着构造函数参数没有隐式类型转换。但是带有显式关键字的双参数构造函数是什么意思? 是 C++11 的新规则吗?

谢谢。

【问题讨论】:

  • 这是准确的声明吗? arena 没有默认值吗?
  • @Gorpik 我不知道 OP 是否有完全相同的界面,但请看here
  • C++“显式”关键字用于避免隐式转换
  • @TobiMcNamobi 感谢您的链接。第 46 行是我引用的内容。
  • @alexbuisson 是的,正如我在问题中提到的那样。但是多参数构造函数呢?

标签: c++ explicit


【解决方案1】:

使用 C++11,您可以使用 braced-init-lists 代替其他一些表达式,这会有所不同。例如,您可以在 return 语句中使用它们:

SkipList foo() {
    return {{}, nullptr}; //does not compile with explicit constructor
    return SkipList{{}, nullptr}; //compiles with or without explicit constructor
}

【讨论】:

  • 统一初始化你的意思是像初始化数组一样初始化多个参数?
  • 谢谢,这很有帮助。
  • @lulyon,统一初始化通常来自使用大括号。您可以使用它们来调用构造函数,作为TypeName() 的简写,并消除最麻烦的解析。这实际上是 C++11 的一个非常重要的特性。您应该查找一些有关它的信息。
  • 这叫做列表初始化
  • @MM,谢谢,我将其更改为使用 braced-init-list 来匹配“顶级”措辞,即使它在所有言归正传。
猜你喜欢
  • 2010-11-10
  • 1970-01-01
  • 2016-07-18
  • 2018-10-29
  • 1970-01-01
  • 2017-12-21
  • 2015-11-15
  • 2016-10-29
  • 2017-12-25
相关资源
最近更新 更多