2013-11-27 4 views
7

Может ли кто-нибудь объяснить, почему конструктор не одиночных параметров помечен как явный компилятор? Насколько я понимаю, это абсолютно бесполезное ключевое слово здесь, так почему это компилируется без ошибок?Явный конструктор не одиночных параметров

class X 
{ 
public: 
    explicit X(int a, int b) { /* ... */} 
}; 
+1

Возможный дубликат [Явное ключевое слово в конструкторе multi-arg?] (Http://stackoverflow.com/questions/1118680/explicit-keyword-on-multi-arg-constructor) –

+0

Он работает для полноты. Хотя он действительно ничего не делает, нет причин для этого, чтобы компиляция потерпела неудачу. –

+0

это случается со мной регулярно. Сначала у меня есть явный конструктор одиночных параметров, тогда я добавляю второй параметр и забываю удалить «явный» –

ответ

10

В C++ 03, а в данном конкретном случае, это не имеет смысла конструктор два параметра должны быть отмечены explicit. Но это может иметь смысл здесь:

explicit X(int i, int j=42); 

Таким образом, маркировка конструктор два параметра с explicit не должен быть ошибка.

В C++ 11, такое использование явно не позволит вам это сделать:

X x = {1,2}; 
+0

Да, но в моем примере компилятор может понять, что нет смысла, и конструктор не может быть вызван одним аргументом, поэтому он может дать ошибку времени компиляции. – axe

+5

@axe Да, я согласен, возможно, правила языка могли быть более строгими в этом вопросе. Вопрос в том, стоит ли добавлять дополнительные осложнения в правила для потенциальной выгоды. Теперь переходим к началу 2011 года и C++ 11, а 'explicit' * * служит цели в многопараметрических конструкторах. Поэтому можно утверждать, что повезло, что правило изначально не было более строгим. – juanchopanza

+0

ОК. Я думаю, мы можем закрыть вопрос. Спасибо всем. – axe

6

Не совсем верно.

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

+0

, но он работает и в старых добрых C++ 98 – axe

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