2017-02-02 9 views
1

以下のサンプル関数は呼び出し側の観点から安全ですか?std :: arrayは安全に返すことができます

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

私は、組み込み配列が安全に返却されないが、std::arrayが安全に返却された場合、私はわからないだということを認識しています。もしそうなら、これはどのように達成されますか?

+0

だけの小さなノート、 'のstdとして:: array'は削除、RAIIを使用するか、あるいはコピー、...それが今であるほどスムーズではないでしょう:) – Rakete1111

+0

@rici RVOはコピーを処理しません。何かがあれば、それはコピーを消去するでしょう... – rubenvb

+0

"*私は組み込みの配列は安全に返却できないことを認識しています*"彼らは一切返却できません。 – juanchopanza

答えて

4

これは問題ありません。 barfoo()から返すとコピーが作成されます。

std::arrayは、配列メンバーを持つ構造体です。そのような構造体がコピーされると、配列もコピーされます。言い換えれば、ベア配列と構造体に含まれる配列のルールが異なります。

+0

意味が成り立ち、グーグルで答えを見つけることができず、健全性チェックが必要でした。ありがとうございました – asimes

0

これは問題ありませんが、速度が遅くなる可能性があります。

C++ 17では、保証されたコピーエリジョンが導入されていますが、NRVOは含まれていません。

1

@Brianは、std::arrayは配列メンバーを持つ構造体であると述べています。あなたがmy_arrayをコピーする際に、そのarrayが深くコピーであることを

template<typename T, std::size_t N> 
struct my_array { 
    T array[N]; 
}; 

注:このような何か。そのような構造体を一時的なオブジェクトにコピーする関数から返すことは、問題を引き起こすことはありません。だから、存在の有無にかかわらず、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, 
+0

なぜスタック上のローカルコンテナが呼び出し元に安全に返されたのかという質問でした – asimes

+0

@asimes Ok。私は無関係な部分を削除しました。 –

関連する問題