foo({0, 0}): Используются ли списки инициализаторов?

Как этот код позволяет вызывать foo без указания типа Vec на строительной площадке? Является ли этот синтаксис случаем списков инициализаторов С++ 11?

struct Vec {
    Vec(int x, int y) {
    }
};
void foo(Vec) {
}
int main() {
    foo({0, 0}); // normally I'd pass Vec(0, 0) or Vec{0, 0}
}

Я уверен, что это дублирующий вопрос, но я не знаю, что искать.


person Stefan Monov    schedule 18.11.2014    source источник
comment
это называется синтаксис инициализации списка копирования   -  person Piotr Skotnicki    schedule 18.11.2014


Ответы (1)


Как заявил Петр С., это инициализация списка копирования. Список braced-init-list используется для инициализации параметра функции. При инициализации списка копирования учитываются только неявные конструкторы. Это означает, что если бы Vec::Vec(int, int) было явным, {0, 0} вызвало бы ошибку компилятора и потребовалось бы Vec{0, 0}.

person Community    schedule 18.11.2014
comment
Спасибо. Является ли инициализация списка копирования новой функцией в С++ 11? - person Stefan Monov; 23.11.2014