Помогите понять странное поведение конструктора

Помогите плиз понять поведение кода приведенного ниже при вызове конструктора.

Собирался исходник в msvc 2010 sp1. Уровень максимальных ворнингов ничего не выводит при сборке.

  1. template<class T>
  2. class Class &;
  3. public:
  4.  
  5.         T* m_ptr;
  6.  
  7.         inline operator T*&;&; const &;
  8.                 return m_ptr;
  9.         &;
  10.  
  11.         inline Class&;T* const ptr&; : m_ptr&;ptr&; &;
  12.                 printf&;"Call constructor Class(T* const ptr)\n"&;;
  13.         &;
  14.  
  15. &;;
  16.  
  17. class Test &;&;;
  18. class TestEx : public Test &;&;;
  19.  
  20. void main&;&; &;
  21.         &;
  22.                 Class<TestEx> testex = new TestEx&;&;;
  23.                 Class<Test> test&;testex&;; // В этом случае конструктор Class(T* const ptr) вызывается
  24.         &;
  25.  
  26.         &;
  27.                 Class<Test> testex = new TestEx&;&;;
  28.                 Class<Test> test&;testex&;; // Почему тут не вызывается конструктор Class(T* const ptr)
  29.         &;
Последняя правка: вс, 24/06/2012 - 23:26
Submitted by Victor on

Комментарии

Потому что конструктор копии должен быть, с точно совпадающим типом или оператором приведения _в_этот_тип_ (а не в базу или наследника).

Стандарт не помню, но факту вот то что ты написал не работает нигде (MSVC, ICPP, GCC, SNC).

Submitted by BLK Dragon on

Витя, здесь  Class<Test> test(testex); // В этом случае конструктор Class(T* const ptr) вызывается

неявно вызывается приведение типов, а так как компилятор нашел в реализации нужные операторы, он их вызывает и результат, предпологаемый тобой, происходит

еще момент - так как конструктор принимает у тебя указатель, а передаешь ты ему объект, то тут и срабатывает твой оператор (), так как компайл о нем знает

Во втором случае - нет приведения типов - у тебя и так передается базовый объект, и тупо по дизассемблу видно, что у тебя происходит тупое копирование объекта в памяти, от сюда и не вызывается твой долгожданный конструктор.

Стандартов я особо не знаю Smile - результат получен на практике.

Submitted by MaxImuS on

Возможно компилер ищет конструктор копирования - но его нет,  а мозгов для преобразования нехватает.

А что будет если написать специализацию под тип Class :)
Последняя правка: пн, 25/06/2012 - 20:42
Submitted by Relyer on
Relyer wrote:

Возможно компилер ищет конструктор копирования - но его нет,  а мозгов для преобразования нехватает.

Не ищет в данном случае, проверял Smile А возможно это просто компиллер от мелкософтных.

Submitted by MaxImuS on

GameDev.by