2013-07-15 17 views
16

Mój kumpel i ja niedawno czytaliśmy kod źródłowy leveldb. I napotykamy ten problem. W leveldb db/skiplist.h pliku, jest deklaracja konstruktora:Dlaczego konstruktor podwójnego parametru zaczyna się od jawnego słowa kluczowego?

explicit SkipList(Comparator cmp, Arena* arena); 

wiem wyraźny konstruktor z jednym parametrem oznacza brak niejawna konwersja typu dla parametru konstruktora. Ale co oznacza podwójny konstruktor parametrów z jawnym słowem kluczowym? Czy to nowa zasada C++ 11?

Dzięki.

+0

Czy to jest dokładna deklaracja? Czy 'arena' nie ma wartości domyślnej? – Gorpik

+2

@Gorpik Nie wiem, czy OP ma dokładnie ten sam interfejs, ale spójrz [tutaj] (http://code.google.com/p/leveldb/source/browse/db/skiplist.h?r=bc1ee4d25e09b04e074db330a41f54ef4af0e31b). – TobiMcNamobi

+0

Słowo kluczowe "jawne" C++ służy do unikania niejawnego przesyłania – alexbuisson

Odpowiedz

16

W C++ 11 można użyć spreparowanych list startowych w miejsce innych wyrażeń, a to robi różnicę. Na przykład możesz ich użyć w oświadczeniach zwrotnych:

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

Jednolita inicjalizacja Masz na myśli inicjowanie wielu parametrów, takich jak inicjowanie tablicy? – lulyon

+0

Dzięki, to bardzo pomocne. – lulyon

+1

@ lulyon, jednolita inicjalizacja jest zwykle wynikiem użycia nawiasów klamrowych. Możesz ich używać do wywoływania konstruktorów, jako skrót do 'TypeName()' i do eliminowania najbardziej irytujących analiz. Jest to całkiem istotna cecha C++ 11. Powinieneś przejrzeć niektóre informacje na ten temat. – chris

Powiązane problemy