Конструкторы для структур в C

#c

#c

Вопрос:

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

Учитывая:

 class B {};

struct A {
   A( B b );
};
  

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

Ответ таков test( b, amp;i );

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

 test( A(b), amp;i);
  

Ответ №1:

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

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

Вот почему C может интерпретировать test(b, amp;i) как test(A(b), amp;i) .

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