アレイと値の初期化については、hereとhereの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-styleT[N]
はこのような状況で同じ動作をしますか?値の初期化中に、当社の=
せず、結果と、初期化子として{}
または()
を使用して
'T()'は値で初期化された 'T'です。 'T'がCスタイルの配列型の場合、無効な構文です。 'T x = {};'または 'T x {};'はより一般的に適用可能な構文です。 – Casey
@Casey値の初期化は、Cスタイルの配列に適用されます。 'T 'がシンプル型指定子でない場合、つまり型を指定する単一の識別子またはキーワードでない場合、' T() 'は構文エラーです。 C++ 03では、 '= {}'は配列のみに適用され、単純な '{}'はエラーです。 – Potatoswatter
重複は、値の初期化に関するものですが、この問題はデフォルトの初期化に関するものです。再度開いて適切な複製を見つけてください。 – Potatoswatter