C++11中列表初始化的优势

3

到目前为止,我已经找到以下使用列表初始化(也称为统一初始化)的用途。

1) 在介绍之前,列表初始化就是一个特性。

int a=3.3f;   // ouch fractional part is automatically truncated

但是在C++11中
int a{3.3f};  // compiler error no implicit narrowing conversion allowed

2) 动态数组元素可以静态初始化。例如,这个程序在C++03中无效,但在C++11中有效:

#include <iostream>
int main()
{
    int* p=new int[3]{3,4,5};
    for(int i=0;i<3;i++)
        std::cout<<p[i]<<' ';
    delete[] p;
}

3) 它解决了最令人烦恼的解析问题

如果您告诉我列表初始化的其他优点,那就更好了。除了上述三个优点之外,列表初始化还有哪些优点吗?

非常感谢您的回答。


2
你的 stacked-crooked.com 链接已经失效了,你只是直接链接到了该网站而不是你的示例。 - mattnewport
@mattnewport:已修复。请查看更新后的问题!!! - Destructor
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Shafik Yaghmour
1
据我所知,标准并没有明确提到编译器错误与编译器警告的概念。哪些是错误,哪些是警告取决于实现,通常可以由用户配置。编译器从未被要求在某些情况下不发出代码,它只需要为格式良好的程序发出符合规范的代码,并在其他一些情况下发出诊断信息。而在未定义行为的情况下,它可以发出任何内容。 - Chris Beck
@ShafikYaghmour:你的意思是说,每个支持C++11的C++编译器并不一定会在编译时对int a{3.3f}; 报错,是吗? - Destructor
显示剩余2条评论
2个回答

4
您没有提到的一个重要优势是它在模板元编程中的有用性,您现在可以使用模板计算一些内容,然后在constexpr函数中展开一些模板数据结构并将结果存储在数组中。
例如,请参见此处:Populate An Array Using Constexpr at Compile-time 在代码中:
template<unsigned... Is>
constexpr Table MagicFunction(seq<Is...>){
  return {{ whichCategory(Is)... }};
}

在C++11之前,我认为没有任何方法可以做到这样的事情。


4

我不确定您是否认为这是一个单独的功能,但相同的语法也用于在std::initializer_list上重载构造函数,这使您可以直接初始化STL容器:

std::map<std::string, std::string> m{{"foo", "bar"}, {"apple", "pear"}};
std::cout << m["foo"] << std::endl;

稍微有一点不利之处std::vector<int> v(1, 2);std::vector<int> v{1, 2};是不同的。 - Bo Persson

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