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