簡體   English   中英

不匹配運算符 &#39;=&#39; (std::array<T, 3> 和 std::initializer_list<T> )

[英]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_liststd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM