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

38

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

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

我不理解这个语法。

m_font{..}

这是什么?它是做什么的?如果这是一个非常愚蠢的问题,我很抱歉。我不知道要搜索什么,所以在这里问。


4
尝试谷歌搜索:“initializer list braces”。 - Shloim
你是在问初始化器大括号列表,还是在问make_shared?如果是后者,请查阅谷歌共享指针。 - mock_blatt
Here: https://dev59.com/uWAf5IYBdhLWcg3wLACq - Ynon
3个回答

25

这在cppreference上有描述,但格式有些难以阅读:

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

...

类或标识符花括号初始化列表 (2) (自C++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类成员。


18
这就引出了一个问题:为什么在初始化时要使用大括号而不是圆括号? - Délisson Junio
6
@wingleader 请参考这个问题,了解C++中类似构造函数和统一初始化的区别。 - Blackhole
在初始化变量后,大括号里应该放什么? - xuiqzy

9
这是一个列表初始化,也称为花括号初始化列表。更具体地说,在这种情况下,它是直接列表初始化。
基本上,m_font变量的值是用花括号中给定的值进行初始化的,在这种情况下,它被初始化为一个shared_ptr,指向构造函数中给定的font对象。

7

Font类有一个成员叫做m_font,类型为std::shared_ptr<sf::Font>,因此在Font类的构造函数中,该成员被初始化为指向font的共享指针。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接