繁体   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