2009-07-13 2 views
28

Недавно я наткнулся на какой-то странный класс, который имел три конструктора:Явное ключевое слово в конструкторе multi-arg?

class Class 
{ 
    public: 
     explicit Class(int); 

     Class(AnotherClass); 

     explicit Class(YetAnotherClass, AnotherClass); 

    // ... 
} 

Это на самом деле не имеет смысла для меня - я думал, что явное ключевое слово, чтобы защитить компилятор выбрал конструкцию из иностранного типа.

Это разрешено? Если это так, что это значит?

+0

Этот дубликат получил больше/лучших ответов: [Почему явным образом разрешены конструкторы и конструкторы по умолчанию с двумя или более параметрами (не по умолчанию)?] (Https://stackoverflow.com/questions/4467142/why-is- явные-разрешенные-для-умолчанию-конструкторы-и-конструкторы-с-2 или больше) –

ответ

46

В C++ 11 многопараметрические конструкторы могут быть неявно преобразованы в с инициализацией скобки.

Однако, перед C++ 11 explicit применяется только к конструкторам с одним аргументом. Для конструкторов с несколькими аргументами он игнорировался и had no effect.

+1

Спасибо за разъяснение. Я бы подумал, что GCC будет предупреждать по этому поводу. – LiraNuna

+26

С оговоркой, что если все, кроме одного из параметров multi-arg, имеют значения по умолчанию, то он будет иметь эффект – zebrabox

+20

Это изменилось с C++ 11. Теперь многопараметрические конструкторы могут быть неявно преобразованы в с инициализацией скобки. – Shane

Смежные вопросы