簡體   English   中英

是std :: array可安全返回

[英]Is std::array safely returnable

從調用者的角度來看,以下示例函數是否安全?

std::array<T, SIZE> foo() {
    std::array<T, SIZE> bar;
    // Initialization of bar members...
    return bar;
}

我知道內置數組不是可以安全返回的,但是我不確定std::array是否可以安全返回。 如果是這樣,這是如何完成的?

這可以。 foo()返回bar進行復制。

std::array是具有數組成員的結構。 復制此類結構時,還將復制數組。 換句話說,規則對於裸數組和結構中包含的數組是不同的。

正如@Brian提到的std::array是具有數組成員的結構。 像這樣:

template<typename T, std::size_t N>
struct my_array {
    T array[N];
};

請注意,當復制my_array ,其array深度復制 因此,從將副本復制到臨時對象的函數中返回此類結構永遠不會引起問題。 因此,無論是否存在RVO ,它始終確保不會有問題。

my_array<int, 5> foo = {1, 2, 3, 4, 5};
my_array<int, 5> bar;

// Copy assignment here
bar = foo;

// Change bar's first element
bar.array[0] = 12;

// Print foo
std::copy(std::begin(foo.array),
          std::end(foo.array),
          std::ostream_iterator<int>(std::cout, ", "));

結果:

1, 2, 3, 4, 5,

很好,但是可能很慢。

C ++ 17引入了保證的復制省略,但不包括NRVO。

暫無
暫無

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

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