2013-08-18 15 views
9

アレイと値の初期化については、herehereの2つの質問をしました。 しかし、このコードで、私は失われています:その値がゼロで初期化されないようなぜstd :: array <int, 10> xはゼロで初期化されていませんが、std :: array <int, 10> x = std :: array <int, 10>()のようですか?

#include <iostream> 
#include <iomanip> 
#include <array> 

template <class T, class U = decltype(std::declval<T>().at(0))> 
inline U f1(const unsigned int i) 
{T x; return x.at(i);} 

template <class T, class U = decltype(std::declval<T>().at(0))> 
inline U f2(const unsigned int i) 
{T x = T(); return x.at(i);} 

int main() 
{ 
    static const unsigned int n = 10; 
    static const unsigned int w = 20; 
    for (unsigned int i = 0; i < n; ++i) { 
     std::cout<<std::setw(w)<<i; 
     std::cout<<std::setw(w)<<f1<std::array<int, n>>(i); 
     std::cout<<std::setw(w)<<f2<std::array<int, n>>(i); 
     std::cout<<std::setw(w)<<std::endl; 
    } 
    return 0; 
} 

予想したように、任意の値を返すf1

    0     0     0 
        1     61     0 
        2     0     0 
        3     0     0 
        4   297887440     0 
        5    32767     0 
        6    4196848     0 
        7     0     0 
        8   297887664     0 
        9    32767     0 

は個人的に私は f2は/任意の値とコピーを持つ配列を作成 xに移動することを考えた:しかし f2は、排他的にゼロ値を返すようです。しかしそれは事実ではないようです。

  • 理由:

    だから、私は2つの質問がありますか?

  • Do C++ 11 std::array<T, N>とC-style T[N]はこのような状況で同じ動作をしますか?値の初期化中に、当社の=せず、結果と、初期化子として{}または()を使用して
+3

'T()'は値で初期化された 'T'です。 'T'がCスタイルの配列型の場合、無効な構文です。 'T x = {};'または 'T x {};'はより一般的に適用可能な構文です。 – Casey

+0

@Casey値の初期化は、Cスタイルの配列に適用されます。 'T 'がシンプル型指定子でない場合、つまり型を指定する単一の識別子またはキーワードでない場合、' T() 'は構文エラーです。 C++ 03では、 '= {}'は配列のみに適用され、単純な '{}'はエラーです。 – Potatoswatter

+0

重複は、値の初期化に関するものですが、この問題はデフォルトの初期化に関するものです。再度開いて適切な複製を見つけてください。 – Potatoswatter

答えて

9

。暗黙的に宣言されたコンストラクターを持つ型の場合、値の初期化は0の初期化を実装します。その名前の通り、各プリミティブ要素は0に設定されます。これはコンストラクタを実行する前に発生しますが、この場合コンストラクタは何も行いません。

コンストラクタは何も実行しません(、簡単な)ので、初期化されていないデータを見ることができます。

Cスタイルの配列では、= T()の代わりに= {}を使用すると、動作が似ています(後者は不正です)。 T()は、名前付きオブジェクトに一時配列オブジェクトを割り当てるように要求しますが、配列を割り当てることはできません。一方、= {}は、配列にbraced-initializer-listを割り当てます。また、braced-initializer-listは、式でもオブジェクトでもない特別な構文構造です。

関連する問題