конструктор копирования с аргументами по умолчанию - PullRequest
14 голосов
/ 07 мая 2010

Насколько я знаю, конструктор копирования должен иметь форму T(const T&) или T(T&). Что если я хочу добавить аргументы по умолчанию в подпись?

T(const T&, double f = 1.0);

Это будет соответствовать стандартам?

Ответы [ 2 ]

27 голосов
/ 07 мая 2010

Да.

& раздел; [class.copy] / 2:

Не шаблонный конструктор для класса X является конструктором copy , если его первый параметр имеет тип X&, const X&, volatile X& или const volatile X&, и любой из них существует никакие другие параметры или все остальные параметры имеют аргументы по умолчанию [ Пример: X::X(const X&) и X::X(X&,int=1) являются конструкторами копирования.

6 голосов
/ 07 мая 2010

Вы можете просто создать два разных конструктора:

T(const T&)
T(const T&,double)

Тем не менее, то, что у вас есть, разрешено использовать в качестве конструктора копирования.

В добавлении, я обнаружил, что обычно этоне очень хорошая идея использовать параметры по умолчанию в C ++, и вместо этого гораздо лучше использовать перегрузки, когда те, у которых меньше параметров, вызывают те, у которых больше параметров, используя значения по умолчанию (конечно, это невозможно с конструкторами в ISO C ++2003, но делегирование конструкторов разрешено в ISO C ++ 201x).Причина этого в том, что значения по умолчанию дают вашим функциям действительные сигнатуры, отличные от их кажущегося поведения, что делает его несколько трудным / болезненным при использовании указателей на функции.Предоставляя перегрузки, можно использовать указатели функций каждого возможного типа вызова, не требуя какого-либо «связующего» механизма для его работы.

...