Пустой список инициализаторов в качестве аргумента не вызывает конструктор по умолчанию
следующий код
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);
.