具有成员初始值设定项列表的代码示例。
#include <memory>
struct Throwable
{
Throwable()
{
throw "Exception!";
}
};
struct A
{
A() : t(Throwable()), i(new int()) {}
Throwable t;
std::unique_ptr<int> i;
};
如果可能有以下评估顺序,我会不会有内存泄漏?
new int()
Throwable()
t()
i()
标准中的顺序是什么?我们有一些规则。
https://en.cppreference.com/w/cpp/language/initializer_list
3) 然后,按照类定义中的声明顺序初始化非静态数据成员。
所以t
会在之前构建i
。
https://en.cppreference.com/w/cpp/language/eval_order
9) 内置逗号运算符的第一个(左)参数的
,
每个值计算和副作用在第二个(右)参数的每个值计算和副作用之前排序。
但是由于前面的引用,成员初始化器列表并没有使用所有的逗号规则。它不是逗号运算符(https://en.cppreference.com/w/cpp/language/operator_other#Built-in_comma_operator)。
10) 在列表初始化中,给定初始化器子句的每个值计算和副作用都排在与任何初始化器子句相关联的每个值计算和副作用之前,该初始化器子句在括号括起来的逗号分隔的初始化器列表中。
和https://en.cppreference.com/w/cpp/language/list_initialization
列表初始化在以下情况下执行:
5) 如果使用了括号初始化列表,则在构造函数的成员初始化列表中
我还有一个案例。
您能否提供定义成员初始化器列表中参数评估顺序的规则?