Vou começar com a sua última pergunta
Além disso, por que o compilador ou o IDE não reclama de main () não retornando um int?
De acordo com o padrão C ++ (função principal 6.6.1)
5 Uma declaração de retorno em main tem o efeito de deixar a função principal (destruindo qualquer objeto com duração de armazenamento automático) e chamar std :: exit com o valor de retorno como argumento. Se o controle sair do final da instrução composta de main, o efeito será equivalente a um retorno com o operando 0 (consulte também 18.3).
E em relação a esta pergunta
Como isso é possível, pois y = 5 não é uma expressão calculável?
No padrão C ++ (operadores de atribuição 8.18 e atribuição composta)
1 O operador de atribuição (=) e os operadores de atribuição composta todos agrupam da direita para a esquerda. Todos exigem um lvalue modificável como seu operando esquerdo e retornam um lvalue referente ao operando esquerdo.
Sp esta declaração
int x{ y = 5 };
pode ser dividido em duas instruções
y = 5;
int x{ y };
Além disso, em C ++, você pode até fazer uma referência à variável y da seguinte maneira
int &x{ y = 5 };
Aqui está um programa demonstrativo
#include <iostream>
int main()
{
int y;
int &x{ y = 5 };
std::cout << "y = " << y << '\n';
x = 10;
std::cout << "y = " << y << '\n';
}
Sua saída é
y = 5
y = 10
Você pode esta declaração
int x{ y = 5 };
reescrever também como
int x = { y = 5 };
No entanto, leve em consideração que há uma diferença entre essas duas declarações (semelhante à das declarações acima).
auto x{ y = 5 };
e
auto x = { y = 5 };
Na primeira declaração a variável x
tem o tipo int
. Na segunda declaração a variável x
tem o tipo std::initializer_list<int>
.
Para tornar a diferença mais visível, veja como os valores dos objetos são gerados.
#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;
}
A saída do programa é
x1 = 5
*x2.begin()= 10
y = 10
y = 5
é uma expressão e tem valor5
. Por que você acha que não é?