C++ std::初始值设定项列表和引用类型

C++ std::初始值设定项列表和引用类型,c++,c++11,initializer-list,C++,C++11,Initializer List,std::initializer\u列表能否包含引用类型(右值和左值)?还是必须使用指针或引用包装器(例如std::ref) 编辑: 也许需要更多的澄清: 我有一个成员变量,::std::vector,我想将lambda对象转发到其中。这通常可以通过emplace\u back来完成,但我想在构造函数的初始化列表中完成。唉,正如我读到的,这将使转发变得不可能 初始值设定项列表对象自动构造为数组 已分配类型为T的元素的个数 因此,它们不能与类似于std::initializer\u list的东西

std::initializer\u列表能否包含引用类型(右值和左值)?还是必须使用指针或引用包装器(例如
std::ref

编辑:

也许需要更多的澄清:

我有一个成员变量,
::std::vector
,我想将lambda对象转发到其中。这通常可以通过
emplace\u back
来完成,但我想在构造函数的初始化列表中完成。唉,正如我读到的,这将使转发变得不可能

初始值设定项列表对象自动构造为数组 已分配类型为T的元素的个数

因此,它们不能与类似于
std::initializer\u list
的东西一起使用。原因与下面给出的编译器错误相同

int& arr[20];
错误:“arr”声明为引用数组

这是由C++标准规定的:

std::initializer\u列表能否包含引用类型(右值和左值)

std::initializer\u list
不包含对其元素的引用。它通过将其值保持为
const
对象来使用复制语义:

18.9
初始值设定项列表
[support.initlist]

初始值设定项列表
类型的对象提供对
常量
类型的对象数组的访问

引用的
初始值设定项\u列表
将导致编译错误,因为iternally指针用于迭代器:

#包括
int main()
{
int x;
std::初始值设定项_list l={x};
//在“class std::initializer_list”的实例化中:
//错误:正在形成指向引用类型“int&”的指针
//typedef常量*迭代器;
}

initializer\u list
也不支持移动语义,因为无法从中移动
const
对象。如果您希望维护引用语义,将对象保存在
std::reference\u包装中是最可行的解决方案。

您的意思是类似
std::initializer\u list a={…}
?@RSahu是的,或者&&,但我脑子里大多是类引用类型。我会说是的,一些可以分配数组的东西。我相信它们确实支持一种移动语义,因为从技术上讲,你可以“移动”一个
常量&
@user1095108不,它们不支持。移动不仅仅是从调用
std::move()
开始的,它只是对右值的转换。采用非常量值引用
(X&&)
的构造函数是实际发生移动的地方,在某些情况下,“移动”
const
对象实际上会创建一个副本,而在另一些情况下则是一个编译错误。我知道,但没有什么可以阻止移动构造函数复制而不是移动。我只是吹毛求疵。