l'-*_*-'l 4 c++ initialization curly-braces list-initialization
我有以下代码:
bool c (a == b);
Run Code Online (Sandbox Code Playgroud)
和
bool c {a == b};
Run Code Online (Sandbox Code Playgroud)
其中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
}
Run Code Online (Sandbox Code Playgroud)
使用花括号{}进行初始化的唯一缺点是它与auto关键字的交互.auto推断{}为std::initializer_list,这是一个已知问题,请参阅"自动和支撑初始化列表".