Can a std::initializer_list
包含引用类型(右值和左值)?或者是否必须使用指针或引用包装器(例如std::ref
)?
EDIT:
也许需要更多澄清:
我有一个成员变量,::std::vector<std::function<void()> >
,我想将 lambda 对象转发到其中。这通常可以通过以下方式完成emplace_back
,但我想在构造函数初始化列表中执行它。唉,正如我所读到的,这将使转发变得不可能。
Can a std::initializer_list
包含引用类型(右值和左值)?
std::initializer_list<T>
不保留对其元素的引用。它用复制语义通过将其价值观保持为const
对象:
18.9
初始化列表 [support.initlist]
类型的对象initializer_list<E>
提供对类型对象数组的访问const E
.
An initializer_list
引用将导致编译错误,因为迭代器内部使用指针:
#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;
}
An initializer_list
也不支持移动语义const
物体不能被移动。将您的物体放在std::reference_wrapper<T>
如果您希望维护引用语义,这是最可行的解决方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)