Ich werde von Ihrer letzten Frage ausgehen
Warum beschwert sich der Compiler oder die IDE nicht darüber, dass main () kein int zurückgibt?
Nach dem C ++ Standard (6.6.1 Hauptfunktion)
5 Eine return-Anweisung in main bewirkt, dass die main-Funktion verlassen wird (Objekte mit automatischer Speicherdauer werden zerstört) und std :: exit mit dem Rückgabewert als Argument aufgerufen wird. Wenn die Steuerung am Ende der zusammengesetzten Anweisung von main abläuft, entspricht der Effekt einer Rückgabe mit dem Operanden 0 (siehe auch 18.3).
Und relativ zu dieser Frage
Wie ist das möglich, da y = 5 kein berechenbarer Ausdruck ist?
Aus dem C ++ - Standard (8.18 Zuweisungs- und zusammengesetzte Zuweisungsoperatoren)
1 Der Zuweisungsoperator (=) und die zusammengesetzten Zuweisungsoperatoren gruppieren sich alle von rechts nach links. Alle benötigen einen modifizierbaren l-Wert als linken Operanden und geben einen l-Wert zurück, der sich auf den linken Operanden bezieht.
Sp diese Erklärung
int x{ y = 5 };
kann äquivalent in zwei Aussagen aufgeteilt werden
y = 5;
int x{ y };
Darüber hinaus können Sie in C ++ auf folgende Weise sogar auf die Variable y verweisen
int &x{ y = 5 };
Hier ist ein Demonstrationsprogramm
#include <iostream>
int main()
{
int y;
int &x{ y = 5 };
std::cout << "y = " << y << '\n';
x = 10;
std::cout << "y = " << y << '\n';
}
Seine Ausgabe ist
y = 5
y = 10
Sie können diese Erklärung
int x{ y = 5 };
auch gerne umschreiben
int x = { y = 5 };
Berücksichtigen Sie jedoch, dass zwischen diesen beiden Erklärungen (ähnlich wie in den obigen Erklärungen) ein Unterschied besteht.
auto x{ y = 5 };
und
auto x = { y = 5 };
In der ersten Deklaration hat die Variable x
den Typ int
. In der zweiten Deklaration hat die Variable x
den Typ std::initializer_list<int>
.
Um den Unterschied besser sichtbar zu machen, sehen Sie, wie die Werte der Objekte ausgegeben werden.
#include <iostream>
int main()
{
int y;
auto x1 { y = 5 };
std::cout << "x1 = " << x1 << '\n';
auto x2 = { y = 10 };
std::cout << "*x2.begin()= " << *x2.begin() << '\n';
std::cout << "y = " << y << '\n';
return 0;
}
Die Programmausgabe ist
x1 = 5
*x2.begin()= 10
y = 10
y = 5
ist ein Ausdruck und hat Wert5
. Warum denkst du, ist es nicht?