마지막 질문부터 시작하겠습니다
또한 컴파일러 또는 IDE가 main ()이 int를 반환하지 않는 것에 대해 불평하지 않는 이유는 무엇입니까?
C ++ 표준 (6.6.1 주요 기능)에 따름
5 main의 return 문은 main 함수를 떠나고 (자동 저장 시간이있는 객체를 파괴 함) 반환 값을 인수로하여 std :: exit를 호출하는 효과가 있습니다. main의 compound-statement의 끝에서 제어가 흐르면, 그 결과는 피연산자가 0 인 리턴과 같습니다 (18.3도 참조).
이 질문과 관련하여
y = 5가 계산 가능한 표현이 아니기 때문에 어떻게 이것이 가능합니까?
C ++ 표준 (8.18 대입 및 복합 대입 연산자)에서
1 대입 연산자 (=)와 복합 대입 연산자는 모두 오른쪽에서 왼쪽으로 그룹화됩니다. 모두 왼쪽 피연산자로 수정 가능한 lvalue가 필요하고 왼쪽 피연산자를 참조하는 lvalue를 반환합니다.
이 선언을 Sp
int x{ y = 5 };
두 문장으로 동등하게 나눌 수 있습니다
y = 5;
int x{ y };
또한 C ++에서는 다음과 같이 변수 y에 대한 참조를 만들 수도 있습니다.
int &x{ y = 5 };
여기에 실증 프로그램이 있습니다
#include <iostream>
int main()
{
int y;
int &x{ y = 5 };
std::cout << "y = " << y << '\n';
x = 10;
std::cout << "y = " << y << '\n';
}
출력은
y = 5
y = 10
이 선언을 할 수 있습니다
int x{ y = 5 };
다시 쓰기
int x = { y = 5 };
그러나이 선언들 (위 선언들과 비슷하게 보임) 사이에 차이점이 있다는 점을 고려하십시오.
auto x{ y = 5 };
과
auto x = { y = 5 };
첫 번째 선언에서 변수 x
의 유형은 int
입니다. 두 번째 선언에서 변수 x
의 유형은 std::initializer_list<int>
입니다.
차이를 더 잘 보이게하려면 객체의 값이 어떻게 출력되는지보십시오.
#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;
}
프로그램 출력은
x1 = 5
*x2.begin()= 10
y = 10
y = 5
인 표현은, 그리고 값을 갖는다5
. 왜 그렇지 않다고 생각합니까?