Ich habe gerade zwei Fragen über Array und Wert Initialisierung here und gestellt. Aber mit diesem Code, ich bin verloren:Warum std :: array <int, 10> x ist nicht gleich Null initialisiert aber std :: array <int, 10> x = std :: array <int, 10>() zu sein scheint?
#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;
}
Wie erwartet, f1
beliebige Werte zurück, wie seine Werte nicht Null initialisiert sind. Aber f2
scheint ausschließlich Nullwerte zurück:
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
Ich persönlich dachte, dass f2
wird ein Array mit beliebigen Werten erstellen und kopieren/verschieben Sie es in x
. Aber es scheint nicht der Fall zu sein.
Also, ich habe zwei Fragen:
- Warum?
- Do C++ 11
std::array<T, N>
und C-StilT[N]
haben das gleiche Verhalten in einer solchen Situation?
'T()' ist ein Wert-initialisiertes 'T'. Und ungültige Syntax, wenn "T" ein C-artiger Array-Typ ist. 'T x = {};' oder 'T x {};' sind allgemein anwendbare Syntaxen. – Casey
@Casey-Wert Initialisierung gilt für C-artige Arrays. "T()" ist ein Syntaxfehler, wenn "T" kein Simple-Type-Specifier ist, d. H. Ein einzelner Bezeichner oder ein Schlüsselwort, das einen Typ bezeichnet. In C++ 03 gilt '= {}' nur für Arrays und das einfache '{}' ist ein Fehler. – Potatoswatter
Das angenommene Duplikat ist über Wert-Initialisierung, aber diese Frage ist über Standard-Initialisierung. Bitte öffnen Sie erneut und finden Sie ein richtiges Duplikat, oder antworten Sie einfach. – Potatoswatter