在构造函数初始化列表中使用花括号理解奇怪的语法

时间:2016-12-18 19:38:20

标签: c++

所以当我遇到这个时,我只是在浏览库的源代码。

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

我不懂语法

m_font{..}

这是什么?它有什么作用。如果这是一个非常愚蠢的问题,我很抱歉。我不知道谷歌会怎么做,所以问这里。

3 个答案:

答案 0 :(得分:19)

这在cppreference中有描述,但有点难以理解:

  

任何构造函数的函数定义的主体,在复合语句的左大括号之前,可能包含成员初始化列表,其语法为冒号字符:,后跟以逗号分隔的一个或多个成员初始值设定项的列表,每个成员初始值设定项

     

...

     

class-or-identifier brace-init-list (2)(自C ++ 11起)

     

...

     

2)使用list-initialization初始化由 class-or-identifier 命名的基类或成员(如果列表为空则变为值初始化,初始化聚合时进行聚合初始化)

这是试图说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类成员的值。

答案 1 :(得分:9)

这是一个list initialization又名大括号列表。更具体地说,在这种情况下,它是直接列表初始化。

基本上,m_font变量使用花括号中给出的值进行初始化,在这种情况下,它被初始化为shared_ptr,用于赋予构造函数的font对象。 / p>

答案 2 :(得分:7)

Font有一个名为m_font的{​​{1}}类型的成员,所以在类std::shared_ptr<sf::Font>的构造函数中,该成员正在使用指向{的共享指针进行初始化{1}}。