use*_*108 12 c++ initializer-list c++11
可以std::initializer_list包含引用类型(rvalue和lvalue)吗?或者是否必须使用指针或引用包装器(例如std::ref)?
编辑:
可能需要进一步澄清:
我有一个成员变量,::std::vector<std::function<void()> >我想转发一个lambda对象.这通常可以用emplace_back,但我想在构造函数的初始化列表中完成.唉,正如我所读到的,这将使转发变得不可能.
可以
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中是最可行的解决方案.
来自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
| 归档时间: |
|
| 查看次数: |
3613 次 |
| 最近记录: |