没有“总是更好”的答案,这是风格问题。
从对象类型的简单表达式(例如createA()
)初始化对象时,我经常使用 copy-init,可能只是因为熟悉=
赋值形式。否则,当初始化器是不同类型或对象有多个初始化器(例如,多个构造函数参数或聚合初始化)时,我更喜欢使用 C++11 列表初始化(又名统一初始化语法),它可以用于更多的地方,例如初始化聚合以及具有用户定义构造函数的类,并且不能被解析为函数声明:
A a1{ createA() };
上面的 list-init 形式使用 direct-init,而这种形式使用 copy-init:
A a2 = { createA() };
使用 list-init 时,我更喜欢没有多余=
符号的直接初始化形式。
There are a few cases where list-init isn't possible, e.g. when a type has an initializer-list constructor (i.e. one taking a parameter that is a specialization of std::initializer_list
) and you want to call a different constructor, but the initializer-list constructor would get chosen, e.g. std::vector<int> v{ 5u, 0 };
will not create a vector of five elements with value zero, but a vector with two elements with values five and zero