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,
从调用者的角度来看,下面的示例函数是否安全?
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,