Почему конструктор с двойным параметром начинается с явного ключевого слова?

Мой приятель и я недавно читали исходный код leveldb. И мы сталкиваемся с этой проблемой. В файле leveldb db/skiplist.h есть объявление конструктора:

explicit SkipList(Comparator cmp, Arena* arena);

Я знаю, что явный конструктор с одним параметром означает отсутствие неявного преобразования типа для параметра конструктора. Но что означает конструктор двойных параметров с явным ключевым словом? Это новое правило С++ 11?

Спасибо.


person lulyon    schedule 15.07.2013    source источник
comment
Это точное заявление? У arena нет значения по умолчанию?   -  person Gorpik    schedule 15.07.2013
comment
@Gorpik Я не знаю, имеет ли ОП точно такой же интерфейс, но посмотрите здесь.   -  person TobiMcNamobi    schedule 15.07.2013
comment
Явное ключевое слово C++ используется, чтобы избежать неявного приведения   -  person alexbuisson    schedule 15.07.2013
comment
@TobiMcNamobi Спасибо за ссылку. Строка 46 - это то, что я цитирую.   -  person lulyon    schedule 15.07.2013
comment
@alexbuisson да, как я упоминал в своем вопросе. Но как насчет конструктора с несколькими параметрами?   -  person lulyon    schedule 15.07.2013
comment
@TobiMcNamobi Спасибо за ссылку   -  person Gorpik    schedule 15.07.2013


Ответы (1)


В C++11 вместо некоторых других выражений можно использовать списки инициализации в фигурных скобках, и это имеет значение. Например, вы можете использовать их в операторах return:

SkipList foo() {
    return {{}, nullptr}; //does not compile with explicit constructor
    return SkipList{{}, nullptr}; //compiles with or without explicit constructor
}
person chris    schedule 15.07.2013
comment
Под равномерной инициализацией вы имеете в виду инициализацию нескольких параметров, например инициализацию массива? - person lulyon; 15.07.2013
comment
Спасибо, это очень полезно. - person lulyon; 15.07.2013
comment
@lulyon, унифицированная инициализация обычно возникает в результате использования фигурных скобок. Вы можете использовать их для вызова конструкторов, в качестве сокращения для TypeName() и для устранения самого неприятного синтаксического анализа. На самом деле это довольно важная особенность C++11. Вам следует поискать некоторую информацию о нем. - person chris; 15.07.2013
comment
Это называется инициализация списка - person M.M; 11.04.2016
comment
@M.M, спасибо, я изменил его, чтобы использовать braced-init-list вместо того, чтобы соответствовать верхнему уровню формулировки, даже если он инициализируется списком, когда все сказано и сделано. - person chris; 11.04.2016
comment
Я не удивлюсь, если этот конструктор изначально имел аргумент по умолчанию (или был адаптирован из конструктора с одним аргументом). Не так много случаев, когда вы действительно хотите отключить инициализацию списка копирования. - person T.C.; 11.04.2016
comment
@TC, Правда, я думаю, это не так уж часто встречается в дикой природе. - person chris; 12.04.2016