我的问题是关于std::initializer_list
类型之间缺少转换,其中包含的类型或多或少具有cv限定的转换似乎很容易实现。std :: initializer_list <int const>不能从std :: initializer_list构建<int>
考虑下面的代码是无效的:
std::initializer_list<int> x{1,2,3,4,5,6};
std::initializer_list<int const> y = x; // error! cannot convert!
现在考虑std::optional
而忽略了可笑的类型:
std::optional<std::vector<int>> x{std::in_place, {1,2,3,4,5}}; // OK
std::optional<std::vector<int const>> y{std::in_place, {1,2,3,4,5}}; // error!
我承担语言规范要求推导非CV合格U
的对于std::initializer_list<U>
默认情况下。
据我所知,具有std::initializer_list
构造函数重载std::optional
(和std::any
和std::variant
)整点是避免指定初始化列表的确切类型。要获得上面代码的第二行来编译,那正是你必须做的。
std::initializer_list
已经拥有一个const*
它的数据(无论如何在libc++
)。我没有理由看到上面的代码不工作?这是一个可以解决的问题,或者我错过了什么?
这是一种很难“忽略可笑的类型”,当'矢量'在C++中明确*不合法*。那么为什么你会期望'initializer_list '工作?你会用它初始化什么? –
说实话,我不知道。当我发现这一点时,我正在编写一个通用的包装类型。 – xcvr
也许这对于一些类似于“dynarray”的类型是有意义的。 – xcvr