[英]Why doesn't `std::initializer_list` provide a subscript operator?
[英]no match for operator '=' (std::array<T, 3> and std::initializer_list<T>)
我有一個模板vec<T>
類,用於常量長度等於 3 的數學向量。它看起來像這樣:
template <typename T>
class vec{
public:
vec() { /**/ }
vec(std::initializer_list<T> list) { /**/ }
private:
std::array<T, 3> data;
};
我知道,可以通過這種方式使用std::initializer_list
初始化std::array
:
std::array<int, 3> a = {1, 2, 3};
所以我想要一個帶有std::initializer_list
的構造std::initializer_list
來像這樣初始化我的向量:
vec<int> v = {1, 2, 3};
我也有一個解決方案:只需遍歷std::initializer_list
元素並寫入data
:
vec(std::initializer_list<T> list) {
size_t i = 0;
for (auto it = list.begin(); it != list.end(); it++) {
data[i++] = *it;
}
}
我試圖讓構造函數看起來像這樣(因為std::array
有一個帶有std::initializer_list
的構造std::initializer_list
):
vec(std::initializer_list<T> list) {
data = list;
}
但是當我嘗試編譯程序時,出現錯誤:
no match for ‘operator=’ (operand types are ‘std::array<int, 3>’ and ‘std::initializer_list<int>)’
這里有什么問題? 為什么我不能以這種方式用初始化列表初始化std::array
?
為什么我不能以這種方式用初始化列表初始化
std::array
?
Braced-init-list 和std::initializer_list
不是一回事。 (甚至std::initializer_list
也可以從braced-init-list 構造。) std::array
是一個聚合並且可以被聚合初始化或由braced-init-list 賦值為
std::array<int, 3> a = {1, 2, 3};
a = {4, 5, 6}; // convert {4, 5, 6} to std::array then assign to a
請注意, {1, 2, 3}
和{4, 5, 6}
都是花括號初始化列表,但不是std::initializer_list
。
std::array
不能從std::initializer_list
初始化(或賦值); 它的構造函數和賦值運算符是隱式定義的,並且沒有這樣的構造函數或賦值運算符采用std::initializer_list
。
std::initializer_list<int> l = {1, 2, 3};
std::array<int, 3> a = l; // doesn't work
a = l; // doesn't work
作為一種可能的解決方法,您可以添加一個采用std::array
的構造函數重載,並使用構造函數初始值設定項列表(不要與std::initializer_list
混淆)來初始化data
:
vec(std::array<T, 3> const& list)
: data{ list }
{
}
您可以將std::initializer_list
視為一個容器類,它專門用於使用obj{args...}
語法的 ctor 參數。
在下面,它包含一個臨時 c 數組,帶有size()
和指向begin()
和end()
指針。 並且std::initializer_list
到std::array
之間沒有隱式轉換。
其他帖子已經提到了這樣做的方法,另一種方法是
std::copy(list.begin(), list.begin() + data.size(), data.begin());
即使您的list.size()
大於data.size()
這也會起作用。
請注意,如果list.size()
小於data.size()
,則超出list.size()
任何內容都將被默認初始化,這將導致標量類型的 ub 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.