값 카테고리에 대해 this article을 살펴보십시오. 타입 및 카테고리의 값 :
값 범주
각각 C++ 식 (등 피연산자 리터럴 변수 이름으로 오퍼레이터)는 두 개의 독립적 인 특성을 특징으로한다. [...]
prvalue
다음식이 prvalue 표현식 :
[...]
- 함수 호출 또는 비 기준 복귀 과부하 조작 식 str.substr (1, 2)와 같은 유형,
좋아요, 그래서 식 func1()
과 func2()
은 prvalues입니다.
[...]
r- 수치
r- 수치 식 prvalue 또는 하나가 xValue이다.
이제 prvalues는 rvalues입니다.
속성 :
이
[...]
를 rvalue가 내장 된 할당 또는 복합 할당 연산자의 왼쪽 피연산자로 사용할 수 없습니다. 여기
는 [...] 중요한 부분이다. 규칙은 기본 제공 할당 만 제외합니다. 클래스 유형의 복사 할당 연산자는 여전히 허용됩니다.
따라서 기본 제공 연산자와 클래스 유형의 연산자는 언어 규칙에 따라 다르게 처리된다는 점이 다릅니다.
지금, 당신이 궁금 할 것이다, 은 왜는 할당은 허용되지 않습니다 내장 타입? 글쎄, 그것에 대한 유스 케이스가 없습니다. 할당에는 부작용이없고 (왼손 피연산자의 값을 변경하는 것 외에는) 반환 값은 무시됩니다. 당신이 그것을 쓰면, 당신은 실수했을 가능성이 큽니다. 이를 허용하지 않으면 프로그래머에게 도움이됩니다.
이제 rvalue 클래스 유형을 쓸모 없게 지정하지 않으려 고 생각할 수도 있습니다. 음, 그렇지 않을 수도 있습니다! 클래스 유형에는 부작용이있는 사용자 정의 할당 연산자가있을 수 있습니다. 그리고 클래스 유형은 이전에 수행 된 할당에 따라 부작용이있는 소멸자를 가질 수 있습니다. Bjarne이나위원회가 언어를 지정했을 때 사용한 논리가이 언어라는 것을 보증 할 수는 없지만 그 점에 대해서는 제 생각입니다.
'func1() = var1;이라고 생각하십니까? –
나는 이것이 Foo 클래스의 대입 연산자를 호출한다는 것을 이해한다. 나의 질문은이 문제에있어서 내장 타입과 사용자 정의 타입의 근본적인 차이점은 무엇인가? Foo & operator = (Foo &); – parsimons
.. 그리고 뭐라구? –