Comenzaré por tu última pregunta
Además, ¿por qué el compilador o el IDE no se quejan de que main () no devuelva un int?
De acuerdo con el estándar C ++ (6.6.1 función principal)
5 Una declaración return en main tiene el efecto de abandonar la función main (destruir cualquier objeto con duración de almacenamiento automática) y llamar a std :: exit con el valor de retorno como argumento. Si el control fluye fuera del final de la declaración compuesta de main, el efecto es equivalente a un retorno con el operando 0 (véase también 18.3).
Y relativo a esta pregunta
¿Cómo es esto posible, ya que y = 5 no es una expresión calculable?
Del estándar C ++ (8.18 Asignación y operadores de asignación compuesta)
1 El operador de asignación (=) y los operadores de asignación compuesta se agrupan de derecha a izquierda. Todos requieren un valor l modificable como su operando izquierdo y devuelven un valor l que se refiere al operando izquierdo.
Sp esta declaración
int x{ y = 5 };
se puede dividir de manera equivalente en dos declaraciones
y = 5;
int x{ y };
Además, en C ++ puede incluso hacer una referencia a la variable y de la siguiente manera
int &x{ y = 5 };
Aquí hay un programa demostrativo
#include <iostream>
int main()
{
int y;
int &x{ y = 5 };
std::cout << "y = " << y << '\n';
x = 10;
std::cout << "y = " << y << '\n';
}
Su salida es
y = 5
y = 10
Puedes esta declaración
int x{ y = 5 };
reescribir también como
int x = { y = 5 };
Sin embargo, tenga en cuenta que hay una diferencia entre estas (que se parecen a las declaraciones anteriores) dos declaraciones.
auto x{ y = 5 };
y
auto x = { y = 5 };
En la primera declaración, la variable x
tiene el tipo int
. En la segunda declaración, la variable x
tiene el tipo std::initializer_list<int>
.
Para que la diferencia sea más visible, vea cómo se generan los valores de los objetos.
#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;
}
La salida del programa es
x1 = 5
*x2.begin()= 10
y = 10
y = 5
es una expresión y tiene valor5
. ¿Por qué crees que no lo es?