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

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

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

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

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

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

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

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

1 ответов


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

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

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


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

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

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