?

Log in

No account? Create an account
 
 
29 January 2007 @ 11:46 pm
Баг конструктора копирования по умолчанию VC8  
Плять! Всплыл баг конструктора копирования, который генерит VC8, и вся стройная концепция wrapperov и template_constructor's пошла в п... Короче, смотрим пример:

Фишка в том, что в конструкторе копирования класса В мы вызываем нифига не коструктор копирования базового класса, а шаблонный конструктор. У класса C правильная реализация (хотя во всех книгах предлагают именно так, как у B). Как ни странно, я всегда использовал именно второй вариант, не знаю почему, но считал, что так правельнее (ну теперь есть убедительное доказательство моей правоте))).

Теперь про баг. VC8 генерит конструктор копирования, такой как у класса B (условно конечно) и поэтому в лучшем случае, код не скомпилируется (если бы у A был бы базовый класс с простым конструктором с одним параметром), в худшем получим неправильную работу программы, и найти причину непросвещенному пользователю будет тяжело. Если бы в классе A был бы конструктор A(T t), т.е. не константная ссылка, то мы бы получили переполнение стека, т.к. конструктор вызывался бы рекурсивно. Но в этом случае VC8 выдает предупреждение, что возможно переполнение стека (жаль, что он при этом не признается, что сам накосячил)))

Теперь придется в доке капсить про то, что конструктор копирования для класса-обертки обязателен и он должен выглядеть именно как в классе C, но кто доки читает?, тем более что все круты, и уж конструктор копирования смогут реализовать и без моей помощи.

 
 
Current Location: дома
Current Music: кулер