2016-10-31 5 views
0
1 class Foo{ 
2 
3 }; 
4 
5 Foo func1(){ 
6 Foo f; 
7 return f; 
8 } 
9 
10 int func2(){ 
11 int a = 2; 
12 return a; 
13 } 
14 
15 int main(int argc, char** argv){ 
16 Foo var1; 
17 func1() = var1; //OK 
18 func2() = 1; //error: expression is not assignable 
19 return 0; 
20 } 

기본 제공 유형의 반환 값에 대한 할당이 허용되지 않지만 사용자 정의 유형 인 반환 값에 대한 할당이 허용되는 근본적인 이유는 무엇입니까? 다른 하나는 허용하지 않는 메모리를 어떻게 관리합니까?반환 값의 범위 및 할당

+1

'func1() = var1;이라고 생각하십니까? –

+0

나는 이것이 Foo 클래스의 대입 연산자를 호출한다는 것을 이해한다. 나의 질문은이 문제에있어서 내장 타입과 사용자 정의 타입의 근본적인 차이점은 무엇인가? Foo & operator = (Foo &); – parsimons

+0

.. 그리고 뭐라구? –

답변

1

값 카테고리에 대해 this article을 살펴보십시오. 타입 및 카테고리의 값 :

값 범주

각각 C++ 식 (등 피연산자 리터럴 변수 이름으로 오퍼레이터)는 두 개의 독립적 인 특성을 특징으로한다. [...]

prvalue

다음식이 prvalue 표현식 :

[...]

  • 함수 호출 또는 비 기준 복귀 과부하 조작 식 str.substr (1, 2)와 같은 유형,

좋아요, 그래서 식 func1()func2()은 prvalues입니다.

[...]

r- 수치

r- 수치 식 prvalue 또는 하나가 xValue이다.

이제 prvalues는 rvalues입니다.

속성 :

[...]

를 rvalue가 내장 된 할당 또는 복합 할당 연산자의 왼쪽 피연산자로 사용할 수 없습니다. 여기

는 [...] 중요한 부분이다. 규칙은 기본 제공 할당 만 제외합니다. 클래스 유형의 복사 할당 연산자는 여전히 허용됩니다.

따라서 기본 제공 연산자와 클래스 유형의 연산자는 언어 규칙에 따라 다르게 처리된다는 점이 다릅니다.


지금, 당신이 궁금 할 것이다, 은 왜는 할당은 허용되지 않습니다 내장 타입? 글쎄, 그것에 대한 유스 케이스가 없습니다. 할당에는 부작용이없고 (왼손 피연산자의 값을 변경하는 것 외에는) 반환 값은 무시됩니다. 당신이 그것을 쓰면, 당신은 실수했을 가능성이 큽니다. 이를 허용하지 않으면 프로그래머에게 도움이됩니다.

이제 rvalue 클래스 유형을 쓸모 없게 지정하지 않으려 고 생각할 수도 있습니다. 음, 그렇지 않을 수도 있습니다! 클래스 유형에는 부작용이있는 사용자 정의 할당 연산자가있을 수 있습니다. 그리고 클래스 유형은 이전에 수행 된 할당에 따라 부작용이있는 소멸자를 가질 수 있습니다. Bjarne이나위원회가 언어를 지정했을 때 사용한 논리가이 언어라는 것을 보증 할 수는 없지만 그 점에 대해서는 제 생각입니다.

+1

아마도 자동으로 할당 된 대입 연산자는 lvalues에만 적용될 수 있도록하기 위해'operator = (const T &) &; ')이어야합니다 (그곳에 후행하는'&'에 유의하십시오.) 이것은보다 직관적이고 아마도 OP의 직감과 함께 왜 임시 할당을 할 것인가? 그리고 개발자는 컴파일러가 rvalues에 할당되도록 '강제 실행'하려는 경우'operator (const T &) && = default; '라고 쓸 수 있습니다. –

+1

@AaronMcDaid 잘, C++ 11 이전에 할당이 있었지만 ref-qualifier는 그렇지 않았기 때문에 암시 적 복사 할당이 원래 어떻게 지정되었는지는 알 수 없었습니다. 이제 ref-qualifier가 존재하기 때문에 그러한 변경이 가능할 것이고 그 채택은 위원회 작업 그룹이 시간의 가치가있는 그러한 변화를 고려하는지 여부 - 이러한 변경이 처음에 공식적으로 제안된다고 가정 할 때. – user2079303

+1

결점을 보니 나는 당신이 사용자 정의 오버로드가있는 유형에 대한 할당 마법을 수행하는 템플리트. 암시 적 연산자로 유형에 대한 할당을 자동으로 최적화합니다. 제안 된 변경 사항은 이러한 템플릿과 호환되지 않습니다. – user2079303