std::initializer_list
可以包含引用类型(rvalue和lvalue)吗?或者是否必须使用指针或引用包装器(例如std::ref
)?
编辑:
或许需要进一步澄清:
我有一个成员变量::std::vector<std::function<void()> >
,我希望转发一个lambda对象。这通常可以使用emplace_back
来完成,但我想在构造函数的初始化列表中完成。唉,正如我所读到的,这将使转发成为不可能。
答案 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