2015-11-07 2 views
6

Есть ли разница между заданным пользователем конструктором по умолчаниюРазница между конструктором по умолчанию (определяемым пользователем) и конструктором с аргументами по умолчанию?

class Simple 
{ 
public: 
    Simple() {} 
}; 

и определенный пользователем конструктором, который принимает несколько аргументов, но имеет значение по умолчанию для каждого из них

class WithDefaults 
{ 
public: 
    WithDefaults(int i = 1) {} 
}; 

кроме этого WithDefaults может также быть построено с явным значением для i?

В частности, мне интересно, насколько эти два конструктора играют тот же самый бросок конструктора по умолчанию для обоих, или если есть тонкие различия между свойствами классов?

Другими словами, является конструктором, который имеет значения по умолчанию для всех своих аргументов конструктора по умолчанию во всех отношениях?

+0

Я ожидал, что это будет дубликат, на самом деле, но я не могу найти ответ нигде. – MicroVirus

+0

Это почти * ответ в [Параметры по умолчанию с конструкторами C++] (http://stackoverflow.com/questions/187640/default-parameters-with-c-constructors), я думаю, но я не уверен. – MicroVirus

+1

В изоляции, я думаю, классы одинаковы. Они могут действовать по-разному, когда учитываются преобразования. Ссылка на второй комментарий от @MicorVirus объясняет это далее. –

ответ

6

Текущий Стандартный рабочий проект N4527 [12.1p4]:

конструктор по умолчанию для класса X является конструктором класса X что либо не имеет параметров или иначе каждый параметр, который не является пакет параметров функции имеет аргумент по умолчанию. [...]

Так что да, конструктор второго класса является абсолютно корректным конструктором по умолчанию.


Просто к сведению, что формулировка в опубликованных версиях C++ 11 и 14 было несколько иначе, но не делает разницы для вашего вопроса. Раньше:

по умолчанию конструктор класса X является конструктором класса X , который может быть вызван без аргумента.

Изменение текущей формулировки было сделано в результате DR 1630, чтобы прояснить семантику инициализации по умолчанию. Раньше в стандарте были места, которые ссылались на «конструктор по умолчанию», подразумевая, что может быть только один; текущая формулировка предназначена для поддержки более сложных сценариев, где потенциально может быть несколько таких конструкторов (например, с использованием SFINAE), а используемая используется с использованием нормального разрешения перегрузки.

+0

Несмотря на то, что * есть * небольшая разница для ABI-совместимости. – Deduplicator

+1

@Deduplicator Хорошая точка, но я полагаю, что подпадает под общий оператор: «функция, которая имеет аргументы по умолчанию для всех параметров, может вызываться с тем же синтаксисом, что и у одного, у которого его нет, но это не значит, что два функции имеют одну и ту же подпись ». – bogdan

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