std :: initializer_list和引用类型

时间:2014-06-08 18:28:54

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

std::initializer_list可以包含引用类型(rvalue和lvalue)吗?或者是否必须使用指针或引用包装器(例如std::ref)?

编辑:

或许需要进一步澄清:

我有一个成员变量::std::vector<std::function<void()> >,我希望转发一个lambda对象。这通常可以使用emplace_back来完成,但我想在构造函数的初始化列表中完成。唉,正如我所读到的,这将使转发成为不可能。

2 个答案:

答案 0 :(得分:8)

  

std::initializer_list可以包含引用类型(rvalue和lvalue)吗?

std::initializer_list<T>不包含对其元素的引用。它使用 copy-semantics 将其值保存为const个对象:

  
    

18.9 初始化列表 [support.initlist]

         

initializer_list<E>类型的对象提供对const E类型对象数组的访问。

  

initializer_list引用将导致编译错误,因为iternally指针用于迭代器:

#include <initializer_list>
int main()
{
    int x;
    std::initializer_list<int&> l = {x};

    // In instantiation of 'class std::initializer_list<int&>':
    // error: forming pointer to reference type 'int&'

    // typedef const _E*  iterator;
}

initializer_list也不支持move-semantics,因为const个对象无法移动。如果您希望维护引用语义,那么将对象保存在std::reference_wrapper<T>中是最可行的解决方案。

答案 1 :(得分:6)

来自http://www.cplusplus.com/reference/initializer_list/initializer_list/

  

initializer_list对象自动构造为数组   已分配类型为T的元素

因此,它们不能用于std::initializer_list<int&>之类的东西。原因是相同的,以下给出了编译器错误

int& arr[20];
  

错误:将'arr'声明为引用数组

这是由C ++标准决定的:https://stackoverflow.com/a/1164306/1938163