我有以下代码:
bool c (a == b);
和
bool c {a == b};
其中a和b是一些相同类型的变量。
我想知道,以上两个初始化有什么区别?在什么情况下应该首选哪个?任何帮助将不胜感激。
两种形式都是直接初始化。
使用花括号{}
进行初始化检查会缩小转换范围,如果发生这种转换,则会生成错误。不像()
。(gcc在这方面是有问题的,需要-Werror=narrowing
缩小范围时需要编译器选项才能生成错误。)
花括号的另一种用途{}
是统一初始化:使用相同的语法在有构造函数和无构造函数的情况下初始化两种类型,例如:
template<class T, class... Args>
T create(Args&&... args) {
T value{std::forward<Args>(args)...}; // <--- uniform initialization + perfect forwarding
return value;
}
struct X { int a, b; };
struct Y { Y(int, int, int); };
int main() {
auto x = create<X>(1, 2); // POD
auto y = create<Y>(1, 2, 3); // A class with a constructor.
auto z = create<int>(1); // built-in type
}
使用花括号{}
进行初始化的唯一缺点是它与auto
关键字的交互。auto
推导{}
为std::initializer_list
,这是一个已知问题,请参阅“自动和括号初始列表”。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句