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