从调用者的角度来看,下面的示例函数是否安全?
std::array<T, SIZE> foo() {
std::array<T, SIZE> bar;
// Initialization of bar members...
return bar;
}
我知道内置数组不能安全返回,但我不确定std::array
是否可以安全返回。如果是的话,这是如何实现的?
答案 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。