С++ с использованием {} вместо () для вызова функции

В С++ я видел функционирующую библиотеку с функцией с такой сигнатурой

DocumentReference::DocumentReference(model::ResourcePath path, std::shared_ptr<Firestore> firestore)
    : firestore_{std::move(firestore)} {
    // code here removed for https://stackoverflow.com/
}

Но библиотека вызывает функцию, используя {} вместо ().

return DocumentReference{
    ResourcePath::FromString(document_path),
    shared_from_this()
};

Какая разница в вызове функции с {} вместо ()?


person heliam1    schedule 06.09.2020    source источник
comment
en.cppreference.com/w/cpp/language/constructor — ссылка. «class-or-identifier brace-init-list» для конкретного случая в показанном коде. Существуют различные другие формы, в которых фигурные скобки ({}) также могут использоваться для инициализации, к которым можно перейти по этой ссылке. Фигурные скобки никогда не используются для вызова функции/метода.   -  person user2864740    schedule 06.09.2020


Ответы (2)


Это не вызов функции. DocumentReference::DocumentReference является конструктором. Есть много способов создать объект, и {} — один из них. Видеть

person phuclv    schedule 06.09.2020
comment
Подождите, конструктор — это не функция? С каких пор это изменилось? - person πάντα ῥεῖ; 06.09.2020
comment
@ πάνταῥεῖ С точки зрения синтаксиса, type(expr) - это приведение, которое в конечном итоге вызывает для вас конструктор, а на самом деле не вызывает конструктор. Вот почему type{expr} имеет смысл. - person Passer By; 06.09.2020
comment
Спасибо всем за помощь, я не смог выяснить это самостоятельно, так как я действительно неправильно понял конструктор как функцию и, таким образом, не нашел соответствующих результатов относительно () vs {} для функций C++. Я думаю, что мы должны оставить заголовок вопроса «функция», а не «конструктор», поскольку {} может использоваться как синтаксис функции в других языках, например. Котлин. - person heliam1; 06.09.2020
comment
@heliam1 Технически конструктор является такой же функцией, как и любая другая, но с особым назначением и допускающим синтаксис, который неприменим к другим обычным функциям. - person πάντα ῥεῖ; 06.09.2020

Какая разница в вызове функции с помощью {} вместо ()?

Отличий в этом случае нет. Оба из них просто инициализируют объект DocumentReference.

Однако предпочтительнее использовать {}.

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#es23-prefer-the--initializer-syntax

person artm    schedule 06.09.2020