Пустой список инициализаторов в качестве аргумента не вызывает конструктор по умолчанию
следующий код
class A {
public:
A() {} // default constructor
A(int i) {} // second constructor
};
int main() {
A obj({});
}
вызывает второй конструктор. Вероятно, пустые initializer_list рассматривается как один аргумент и превращается в int. Но когда вы удаляете второй конструктор из класса, он вызывает конструктор по умолчанию. Почему?
кроме того, я понимаю, почему A obj { {} } всегда будет вызывать конструктор с одним аргументом, поскольку мы передаем один аргумент, который является пустым initializer_list.
2 ответов
наличие скобок, окружающих фигурные скобки в A obj({}); указывает, что конструктор с одним аргументом будет вызван, если это возможно. В этом случае это возможно, потому что пустой список инициализаторов или braced-init-list, может использоваться для инициализации значения int, поэтому конструктор одного аргумента вызывается с помощью i=0.
при удалении конструктора с одним аргументом A obj({}); больше не может вызывать конструктор по умолчанию. Однако {} может использоваться для построения по умолчанию A а затем конструктор копирования может быть вызван для инициализации obj. Вы можете подтвердить это, добавив A(const A&) = delete;, и код не будет компилироваться.
потому что {} на A obj({}); в конечном итоге интерпретируется как тип int. Таким образом, код в конечном итоге похож на A obj(0);.