Пустой список инициализаторов в качестве аргумента не вызывает конструктор по умолчанию

следующий код

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);.