Ho appena fatto due domande sull'inizializzazione di array e valore here e here. Ma con questo codice, mi sono perso:Perché std :: array <int, 10> x non è inizializzato a zero ma std :: array <int, 10> x = std :: array <int, 10>() sembra essere?
#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;
}
Come previsto, f1
restituiscono valori arbitrari come i suoi valori non sono-inizializzato a zero. Ma f2
sembra restituire esclusivamente valori zero:
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
Personalmente ho pensato che f2
creerà un array con valori arbitrari e copia/spostarlo x
. Ma non sembra essere il caso.
Così, ho due domande:
- Perché?
- Do C++ 11
std::array<T, N>
e C-styleT[N]
hanno lo stesso comportamento in una situazione del genere?
'T()' è un valore 'T' inizializzato. E sintassi non valida se 'T' è un tipo di matrice in stile C. 'T x = {};' o 'T x {};' sono sintassi più generalmente applicabili. – Casey
@ L'inizializzazione del valore di Call si applica agli array in stile C. 'T()' è un errore di sintassi se 'T' non è un identificatore del tipo semplice, cioè un identificatore singolo o una parola chiave che identifica un tipo. In C++ 03, '= {}' si applica solo agli array e il semplice '{}' è un errore. – Potatoswatter
Il presunto duplicato riguarda l'inizializzazione del valore, ma questa domanda riguarda l'inizializzazione di default. Si prega di riaprire e trovare un duplicato corretto, o semplicemente rispondere. – Potatoswatter