我的問題是關於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