我的问题是关于在
现在考虑一下
我假设语言规范要求默认推导非cv限定的
std::initializer_list
类型之间缺少转换的问题,其中包含的类型具有更多或更少的cv限定符,尽管这些转换似乎很容易实现。考虑以下无效代码: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限定的
std::initializer_list<U>
中的U
类型。
据我所知,std::optional
(以及std::any
和std::variant
)具有std::initializer_list
构造函数重载的整个目的是避免指定初始化列表的确切类型。为了使上面代码的第二行编译通过,这正是您必须做的。
std::initializer_list
已经在其数据中持有const*
(在libc++
中)。我看不到上述代码无法工作的理由?这是一种可解决的语言问题,还是我漏掉了什么?
vector<int const>
明确是不合法的,因此很难“忽略荒谬的类型”。那么你为什么期望initializer_list<T const>
能够正常工作呢?你会用它来做什么初始化? - Nicol Bolasdynarray
的类型会更加合适。 - xcvrvector<int const>
是意外地不合法的,它可能会在C++17中变得合法,但并非出于意图,而是作为其他更改的副产品。 - M.Mstd::vector
无关。 - xcvr