2016-10-05 4 views
6

Я наткнулся на следующий практический вопрос и ответ, изучая C++, и я этого не понимаю.Конструкторы для структур в C++

Дано:

class B {}; 

struct A { 
    A(B b); 
}; 

Вызов функции аннулируются test(A a, int* b=0); с двумя соответствующими переменными B b, int i;

Ответ test(b, &i);

Мой вопрос, как же его достаточно, чтобы пройти необходимый параметр конструктора и на самом деле не называть его? На мой взгляд, ответ должен быть:

test(A(b), &i); 

ответ

8

Это работает, потому что A имеет конструктор с одним аргументом, который использует C++ как converting constructor:

конструктор, который не объявлен с помощью спецификатора explicit и который может быть вызван одним параметром (до C++ 11), называется конструктором преобразования. В отличие от явных конструкторов, которые рассматриваются только при прямой инициализации (включая явные преобразования, такие как static_cast), конструкторы преобразования также рассматриваются во время инициализации копии как часть пользовательской последовательности преобразования.

Именно поэтому C++ может интерпретировать test(b, &i) как test(A(b), &i).

Если вы не хотите этого поведения, отметьте конструктор Aexplicit.