Подтвердить что ты не робот

Конструктор копирования с аргументами по умолчанию

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

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

Будет ли это соответствовать стандартам?

4b9b3361

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