Конструктор копирования с аргументами по умолчанию
Насколько мне известно, конструктор копирования должен иметь вид T(const T&)
или T(T&)
. Что делать, если я хочу добавить аргументы по умолчанию в подпись?
T(const T&, double f = 1.0);
Будет ли это соответствовать стандартам?
Ответы
Ответ 1
Да.
& раздел; [class.copy]/2:
Конструктор без шаблона для класса X
является конструктором копирования, если его первый параметр имеет тип X&
, const X&
, volatile X&
или const volatile X&
, а также нет других параметров или все остальные параметры имеют аргументы по умолчанию. [Пример: X::X(const X&)
и X::X(X&,int=1)
являются конструкторами копирования.
Ответ 2
Вы можете просто создать два разных конструктора:
T(const T&)
T(const T&,double)
Однако то, что у вас есть, разрешено как конструктор копирования.
На стороне примечания, я обнаружил, что обычно не рекомендуется использовать параметры по умолчанию в С++, и вместо этого гораздо лучше использовать перегрузки, где те, у которых меньше параметров, вызывают те, у которых больше параметров, используя значения по умолчанию (конечно, это невозможно с конструкторами в ISO С++ 2003, но делегирование конструкторов разрешено в ISO С++ 201x). Причина этого в том, что значения по умолчанию дают вашим функциям разные фактические сигнатуры, чем их кажущееся поведение, что делает его несколько сложным/болезненным при выборе указателей на функции. Предоставляя перегрузки, указатели на функции каждого возможного типа вызова могут быть приняты без какого-либо механизма привязки, чтобы заставить его работать.