为什么双参数构造函数以explicit关键字开头?

17

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

explicit SkipList(Comparator cmp, Arena* arena);

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

谢谢。


这是确切的声明吗?arena 没有默认值吗? - Gorpik
2
@Gorpik 我不确定原帖的接口是否完全相同,但可以看看这里:http://code.google.com/p/leveldb/source/browse/db/skiplist.h?r=bc1ee4d25e09b04e074db330a41f54ef4af0e31b。 - TobiMcNamobi
C++中的"explicit"关键字用于避免隐式转换。 - alexbuisson
@TobiMcNamobi 感谢提供链接。我引用的是第46行。 - lulyon
@alexbuisson 是的,就像我在问题中提到的那样。但是对于多参数构造函数呢? - lulyon
1个回答

16

使用C++11,你可以在某些其他表达式的位置上使用大括号初始化列表,这会有所不同。例如,你可以在返回语句中使用它们:

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

通过统一初始化,您是指像初始化数组一样初始化多个参数吗? - lulyon
1
@lulyon,统一初始化通常是使用大括号的结果。您可以使用它们来调用构造函数,作为TypeName()的简写,并消除最令人烦恼的解析。这实际上是C++11的一个非常重要的特性。您应该查找一些相关信息。 - chris
这被称为列表初始化 - M.M
@M.M,谢谢,我已经改用braced-init-list来匹配“顶层”措辞,尽管最终它是列表初始化的。 - chris
如果这个构造函数最初有一个默认参数(或者是从一个单参数构造函数改编而来),我不会感到惊讶。实际上,你很少需要禁用复制列表初始化的情况。 - T.C.
@T.C.,没错,我猜这些在实际应用中并不常见。 - chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接