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

Есть ли разница между пользовательским конструктором по умолчанию?

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

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

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

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

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

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


person MicroVirus    schedule 07.11.2015    source источник
comment
На самом деле я ожидал, что это будет дубликат, но нигде не могу найти ответа на этот вопрос.   -  person MicroVirus    schedule 08.11.2015
comment
Ответ на него почти был дан в Параметры по умолчанию с конструкторами C ++, я думаю, но я не уверен.   -  person MicroVirus    schedule 08.11.2015
comment
По отдельности, я думаю, классы одинаковы. Они могут действовать по-разному, когда учитываются конверсии. Ссылка во втором комментарии @MicorVirus объясняет это дальше.   -  person Anon Mail    schedule 08.11.2015
comment
Замечательный вопрос! Я не предлагаю это как окончательный ответ, но по моему опыту всегда получалось, что они одинаковы.   -  person GreatAndPowerfulOz    schedule 08.11.2015
comment
Да, этот вопрос меня не касается explicit, но с этим нужно быть осторожным.   -  person MicroVirus    schedule 08.11.2015


Ответы (1)


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

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

Итак, да, конструктор второго класса - вполне допустимый конструктор по умолчанию.


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

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

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

person bogdan    schedule 07.11.2015
comment
Хотя существует небольшая разница, которую следует учитывать при совместимости с ABI. - person Deduplicator; 08.11.2015
comment
@Deduplicator Хороший момент, но я предполагаю, что это подпадает под общее утверждение: функция, имеющая аргументы по умолчанию для всех параметров, может быть вызвана с тем же синтаксисом, что и функция, у которой их нет, но это не означает, что две функции имеют та же подпись. - person bogdan; 08.11.2015