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 是具有数组成员的结构。当复制这样的结构时,数组也会被复制。换句话说,裸数组和结构中包含的数组的规则不同。

没问题,但可能会很慢。

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

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