Подтвердить что ты не робот

Понимание странного синтаксиса с фигурными фигурными скобками в списке инициализаторов конструктора

Итак, я просто просматривал исходный код библиотеки, когда столкнулся с этим.

Font::Font(const sf::Font& font) :
        m_font{std::make_shared<sf::Font>(font)}
    {
    }

Я не понимаю синтаксис

m_font{..}

Что это? Что оно делает. Прошу прощения, если это действительно глупый вопрос. Я не знаю, что делать с Google, поэтому просим здесь.

4b9b3361

Ответ 1

Это описано в cppreference, но в несколько трудном для чтения формате:

Тело определения функции любого конструктора перед открывающей скобкой составного оператора может включать в себя список инициализаторов членов, синтаксис которого представляет собой символ двоеточия :, за которым следует разделенный запятыми список одного или нескольких член-инициализаторы, каждый из которых имеет следующий синтаксис

...

class-or-identifier brace-init-list (2) (поскольку С++ 11)

...

2) Инициализирует базу или элемент, названный классом или идентификатором, используя инициализацию списка (которая становится инициализацией инициализации по значению, если список пуст и агрегатная инициализация при инициализации совокупности)

То, что это пытается сказать, состоит в том, что X::X(...) : some_member{some_expressions} { ... } вызывает член класса some_member для инициализации из some_expressions. Учитывая,

struct X {
    Y y;
    X() : y{3} {}
};

элемент данных y будет инициализирован точно так же, как будет инициализирована локальная переменная Y y{3};.

В вашем случае std::make_shared<sf::Font>(font) выводит значение, которое будет использоваться для инициализации члена класса m_font.

Ответ 2

Это список инициализации, а также список инициализаторов. Более конкретно, в этом случае это инициализация с прямым списком.

В основном переменная m_font инициализируется значением, указанным в фигурных скобках, в этом случае оно инициализируется на shared_ptr для объекта font, заданного конструктору.

Ответ 3

Класс Font имеет член под названием m_font типа std::shared_ptr<sf::Font>, поэтому в конструкторе класса Font этот элемент инициализируется с общим указателем на Font.