Конструктор копирования с аргументами по умолчанию
Насколько мне известно, конструктор копирования должен иметь вид 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). Причина этого в том, что значения по умолчанию дают вашим функциям разные фактические сигнатуры, чем их кажущееся поведение, что делает его несколько сложным/болезненным при выборе указателей на функции. Предоставляя перегрузки, указатели на функции каждого возможного типа вызова могут быть приняты без какого-либо механизма привязки, чтобы заставить его работать.