保留std :: initializer_list的副本是否安全?理由是什么?

时间:2014-11-26 19:18:45

标签: c++ c++11 c++14 initializer-list

在我的环境中,std::initializer_list被实现为指向第一个元素和大小的指针。仍然在我的具体设置中,我能够观察到:

  • 基础数据在当前功能框中分配(因为指向第一个元素的指针是这样的)
  • 从函数返回值initializer_list不会更改指针的值(导致数据不会与initializer_list一起复制)。

如果副本可以比原始对象更长,则复制initializer_list会造成不安全。

  • 这种行为是否会通过C ++标准的进一步发布来维护?
  • 同样重要的是,这种行为背后的理由是什么? (今天我觉得很难,所以我天真地说它违背了“最不惊讶”这个心爱的原则)

1 个答案:

答案 0 :(得分:8)

从C ++ 11标准,18.9 [support.initlist]:

  

2 类型为initializer_list的对象提供对const E类型对象数组的访问。[注意:一对指针或指针加上一个长度将是initializer_list的明显表示。 initializer_list用于实现8.5.4中指定的初始化列表。 复制初始值设定项列表不会复制基础元素。 - 结束注释]

就像指点对象一样。您还可以使指针比对象更活跃。如果你想安全地做到这一点,请改为采用/存储一个元素向量。

复制元素会使它变得昂贵,因此没有人会使用它。 documentation available清楚地说明了它的作用。

修改

这是Stroustrup对initializer_listN2100的提案。阅读它可能会启发它的设计决策。