問題

我專門給出的任務的專案指南禁止使用向量和字串,但我需要從函式中傳遞一個不確定大小的char陣列.如果我可以更好地理解它的使用方式,使用跨度似乎是可行的.如果有人可以推薦更好/不同的傳遞陣列的方法(除了字串和向量),我希望瞭解它.

我已經考慮生成一個劃痕檔案並在那裡儲存輸入文字以回憶程式中的其他地方,但這似乎比在這種情況下應該更麻煩.這個程式也足夠小,我可以在主要做一切,但這也不必要.

我想要做的是能夠呼叫這樣的函式:

 span<char> getSpan(){
    char arr[] = { 'A', 'B', 'C' };
    span<char> spanOut{ arr };
    return spanOut;
}
 

然後從主列印spanOut的內容:

 int main() {
    // Some Code...
    printSpan = getSpan();
    std::cout << printSpan;
}
 

理想情況下,上述程式碼的結果是將 ABC 列印到終端。

  最佳答案

span是一個不擁有的檢視.它類似於指標和引用.當getSpan返回時,本地陣列arr不再存在.返回的跨度指向這個不存在的陣列,並訪問它會導致未定義的行為.這類似於懸掛指標問題.

如果您確保在函式返回後儲存仍然存在,則可以返回span:

 auto getSpan()
{
    static char arr[] = { 'A', 'B', 'C' }; // note: static
    return span(arr);
}
 

請注意,只要您返回帶有指標語義的東西(即,不擁有) – 迭代器,引用等,這個問題就存在。

  相同標籤的其他問題

c++guideline-support-library