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

Sid*_*mas 29 c++

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

Font::Font(const sf::Font& font) :
        m_font{std::make_shared<sf::Font>(font)}
    {
    }
Run Code Online (Sandbox Code Playgroud)

我不懂语法

m_font{..}
Run Code Online (Sandbox Code Playgroud)

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

小智 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} {}
};
Run Code Online (Sandbox Code Playgroud)

数据成员的y初始化方式Y y{3};与初始化局部变量的方式完全相同.

在您的情况下,std::make_shared<sf::Font>(font)生成将用于初始化m_font类成员的值.

  • 这引出了一个问题:为什么要使用大括号而不是括号进行初始化? (12认同)
  • @wingleader参见[this question](http://stackoverflow.com/questions/24953658/what-are-the-differences-between-c-like-constructor-and-uniform-initialization). (4认同)

tam*_*bre 8

这是列表初始化 aka brace初始化列表.更具体地说,在这种情况下,它是直接列表初始化.

基本上,m_font变量是使用花括号中给出的值初始化的,在这种情况下,它被初始化为a 给予构造函数shared_ptrfont对象.


Mo *_*eed 7

该类Font有一个名为m_fonttype 的成员std::shared_ptr<sf::Font>,因此在该类的构造函数中,Font该成员正在使用共享指针进行初始化font.