簡體   English   中英

返回對數組的引用有意義嗎?

[英]Does returning a reference to an array make sense?

不能返回對數組的引用是常識。 我已經讀過C ++為什么不支持返回數組的函數? 答案之一就是人們long測這是設計決定。 另一個答案建議改用向量或結構(what ??),並說:

但是,您返回的數組將降級為指針,因此您將無法僅從返回值中得出其大小。

但是,通過使用引用來保留數組的大小也是常識。 例如,以下工作:

int arr[10];

int (&func())[10]
{
    return arr;
}

int main()
{
    int (&arr)[10] = func();
    for (int i = 0; i < 10; ++i)
        std::cout << i << " ";
}

除了通常的“您應該使用vector或std :: array”之外,這種方法還存在什么問題? 我看不到為什么人們會盡可能地關心返回數組。

您似乎對vector不屑一顧。 但是,請確保您清楚地了解到vector實際上是Java和許多其他流行語言中的數組的C ++等效項。 不要被稍微不同的聲明語法所迷惑。 使用[] C ++中的野獸與Java數組非常不同。

繼續您的問題:是的,您可以通過引用返回C樣式的數組。 您的代碼是正確的。 但是它的用例很少,這可能就是為什么您以前沒有看過它的原因。

在現代C ++中,最好避免使用C樣式的數組,因為它們不遵循其他對象具有的值語義。 (例如,它們不能通過函數的值返回)。 它們是從C繼承的丑陋,不幸的是,現在完全從標准中刪除已經太晚了。

std::array<int, 10>乍一看可能很難看,但是當您嘗試復制,移動或返回它時,它的表現會很好。

您編寫的代碼完全可以接受。 有很多原因導致它不經常執行:

  • 數組的大小必須在編譯時固定。 許多返回數組的函數都希望返回可變數量的元素。
  • 該存儲不能在函數本地,或者如果它必須是靜態的。 永遠都不想返回對不再存在的對象的引用。 它可能似乎起作用,但這實際上是一件壞事-您不會立即注意到自己的錯誤。 您的測試用例是非常人為的,您通常不會返回對全局的引用。

另一個答案建議使用向量或結構代替(什么?)

結構是可復制的,因此,如果將數組嵌入結構中,則可以像普通值類型一樣返回它。 你不能用數組做到這一點。

我看不到為什么人們會盡可能地關心返回數組。

因為您所做的只是不是很有用,所以它只是對全局數組的訪問器。 您沒有返回一個數組,每次都返回相同的數組。 這將失敗:

auto arr1 = func();
auto arr2 = func();
arr1[0] = 1;
arr2[0] = 2;
assert( arr1[0] == 1 );   // fails

想要從一個函數返回一個數組的人希望每次調用該函數時都返回一個不同的數組,而不僅僅是每次都引用相同的數組。 您可以使用相同的方法來調用返回int的函數,並且每次都使用不同的值,並且單獨的調用不會返回對同一狀態的引用。 您尚未解決他們的問題,您只是做了其他事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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