std :: initializer_list和引用类型

use*_*108 12 c++ initializer-list c++11

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

编辑:

可能需要进一步澄清:

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

0x4*_*2D2 8

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

std::initializer_list<T>不包含对其元素的引用.它通过将其值保存为对象来使用复制语义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;
}
Run Code Online (Sandbox Code Playgroud)

一个initializer_list也不支持移动,语义const对象不能移动.std::reference_wrapper<T>如果您希望维护引用语义,那么将对象保存在a中是最可行的解决方案.


Mar*_* A. 6

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

initializer_list对象自动构造,就像分配了类型为T的元素数组一样

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

int& arr[20];
Run Code Online (Sandbox Code Playgroud)

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

这取决于C++标准:https://stackoverflow.com/a/1164306/1938163