2013-07-15 12 views
16

私のバディと私は最近leveldbのソースコードを読んでいます。そして、私たちはこの問題に遭遇します。 leveldb db/skiplist.hファイルでは、コンストラクタ宣言があります:二重パラメータコンストラクタが明示的なキーワードで始まるのはなぜですか?

explicit SkipList(Comparator cmp, Arena* arena); 

私は、単一のパラメータで明示的なコンストラクタは、コンストラクタのパラメータには、暗黙の型変換を意味しません知っています。しかし、明示的なキーワードを持つ二重パラメータのコンストラクタはどういう意味ですか? C++ 11の新しい規則ですか?

ありがとうございました。

+0

これは正確な宣言ですか? 'arena'はデフォルト値がありませんか? – Gorpik

+2

@Gorpik OPがまったく同じインターフェイスを持っているが、[ここ](http://code.google.com/p/leveldb/source/browse/db/skiplist.h?r=bc1ee4d25e09b04e074db330a41f54ef4af0e31b)を見ればわかりません。 – TobiMcNamobi

+0

暗黙のキャストを避けるためにC++の「明示的」キーワードが使用されています – alexbuisson

答えて

16

C++ 11では、他の式の代わりにbraced-init-listsを使用することができます。たとえば、返信文で使用することができます。

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

均一な初期化とは配列を初期化するなどの複数のパラメータを初期化することですか? – lulyon

+0

ありがとう、それは非常に有用です。 – lulyon

+1

@lulyon、統一的な初期化は一般的に中括弧の使用に起因します。 'TypeName()'の略語としてコンストラクタを呼び出すために、そして最も厄介な解析を排除するためにそれらを使うことができます。実際にはC++ 11のかなり重要な機能です。あなたはそれについていくつかの情報を調べるべきです。 – chris

関連する問題