std :: array是否可以安全返回

时间:2017-02-02 05:43:01

标签: c++ stdarray

从调用者的角度来看,下面的示例函数是否安全?

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

我知道内置数组不能安全返回,但我不确定std::array是否可以安全返回。如果是的话,这是如何实现的?

3 个答案:

答案 0 :(得分:4)

这很好。从bar返回foo()会复制。

std::array是一个具有数组成员的结构。复制此类结构时,也会复制该数组。换句话说,结构中包含的裸阵列和数组的规则不同。

答案 1 :(得分:1)

正如@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,

答案 2 :(得分:0)

没关系,但可能会很慢。

C ++ 17引入了保证副本省略,但不包括NRVO。