【问题标题】:Advantages of list initialization in C++11C++11中列表初始化的优点
【发布时间】:2015-12-04 11:18:16
【问题描述】:

到目前为止,我发现了 list initialization 的以下用法(又名统一初始化)。

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) 它解决了most vexing parse 问题

如果你告诉我列表初始化的其他优点会更好。除了以上3点之外,列表初始化还有什么优势吗?

非常感谢您的回答。

【问题讨论】:

  • 您的 stack-crooked.com 链接已损坏,您只是直接链接到该网站而不是您的示例。
  • @mattnewport:修复它。查看更新的问题!!!
  • 请注意narrowing conversion is ill-formed,它需要诊断而不是错误。您的问题似乎暗示需要一个错误。
  • @ShafikYaghmour 与 C++ 标准一致,在记录格式错误的代码时在示例中使用“error: ...”
  • @ShafikYaghmour:据我所知,该标准并未明确提及编译器错误与编译器警告的概念。哪些是错误与警告是由实现决定的,通常由用户配置。编译器从不要求在某些情况下不发出代码,它只需要发出符合格式良好程序规范的代码,并在某些其他情况下发出诊断信息。如果出现未定义的行为,它可以发出它想要的任何东西。

标签: c++ c++11 list-initialization


【解决方案1】:

您没有提到的一个显着优势是它在模板元编程中的有用性,您现在可以使用模板计算某些东西,然后在 constexpr 函数中展开一些模板数据结构并将结果存储在一个数组中。

例如在这里查看:Populate An Array Using Constexpr at Compile-time

在代码中:

template<unsigned... Is>
constexpr Table MagicFunction(seq<Is...>){
  return {{ whichCategory(Is)... }};
}

我认为在 C++11 之前没有任何方法可以做类似的事情。

【讨论】:

    【解决方案2】:

    我不确定你是否认为它是一个单独的功能,但同样的语法也用于重载 std::initializer_list 上的构造函数,它允许你直接初始化 STL 容器:

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

    【讨论】:

    • std::vector&lt;int&gt; v(1, 2);std::vector&lt;int&gt; v{1, 2}; 有一点不同的缺点
    猜你喜欢
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多