2010-05-07 6 views
13

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

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

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

+0

См. [Этот PR] (http://llvm.org/bugs/show_bug.cgi?id=5989), который я когда-то отправлял, чтобы играть в некоторые игры, чтобы играть с этим. –

+0

http://punchlet.wordpress.com/2009/12/03/letter-the-third/ – 2010-05-07 17:55:33

ответ

25

Да.

§ [class.copy]/2:

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

6

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

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

Однако то, что у вас есть допускается как конструктор копирования.

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

+1

Хороший вопрос. Принимая адрес перегруженных функций, тоже боль, ИМО, но по крайней мере она работает. – UncleBens

 Смежные вопросы

  • Нет связанных вопросов^_^