C ++ : 반환 값은 L- 값입니까?
이 코드를 고려하십시오.
struct foo
{
int a;
};
foo q() { foo f; f.a =4; return f;}
int main()
{
foo i;
i.a = 5;
q() = i;
}
어떤 컴파일러도 Clang에 대해 불평하지 않습니다. q() = ...
라인이 올바른 이유 는 무엇 입니까?
아니요, 함수의 반환 값은 참조 (C ++ 03) 인 경우에만 l- 값입니다. (5.2.2 [expr.call] / 10)
반환 된 형식이 기본 형식이면 컴파일 오류입니다. (5.17 [expr.ass] / 1)
이것이 작동하는 이유 const
는 클래스 유형의 r 값에 대해 멤버 함수 (비 멤버 함수 포함) 를 호출 할 수 있고 할당이 foo
구현 정의 멤버 함수 이기 때문 입니다 : foo& foo::operator=(const foo&)
. 5 절의 연산자에 대한 제한은 내장 연산자 (5 [expr] / 3) 에만 적용 됩니다. 오버로드 해결이 연산자에 대해 오버로드 된 함수 호출을 선택하면 해당 함수 호출에 대한 제한이 대신 적용됩니다.
이것이 클래스 유형의 const
객체 를 객체 (예 :) 로 반환하는 것이 권장되는 이유입니다 const foo q();
. 그러나 이것은 C ++ 0x에서 부정적인 영향을 미칠 수 있으며 이동 의미론이 제대로 작동하지 못하게 할 수 있습니다.
구조체를 할당 할 수 있고, 제공된 값에 반환 된 구조체를 할당 q()
하는 복사본을 struct foo
반환하기 때문입니다.
이것은 구조체가 나중에 범위를 벗어나고 처음에 그것에 대한 참조를 유지하지 않으므로 어쨌든 (이 특정 코드에서) 아무것도 할 수 없기 때문에이 경우 실제로 아무것도하지 않습니다.
이것은 더 의미가 있습니다 (아직 "모범 사례"는 아니지만)
struct foo
{
int a;
};
foo* q() { foo *f = new malloc(sizeof(foo)); f->a = 4; return f; }
int main()
{
foo i;
i.a = 5;
//sets the contents of the newly created foo
//to the contents of your i variable
(*(q())) = i;
}
이것의 흥미로운 응용 :
void f(const std::string& x);
std::string g() { return "<tag>"; }
...
f(g() += "</tag>");
여기 g() +=
에서 임시를 수정합니다. +
g ()의 반환 값에 할당 된 힙에 </tag>
.
GCC / C ++ 11과 함께 ideone.com에서 실행 되는 것을 확인하십시오 .
이제 어떤 컴퓨팅 초보자가 최적화와 악에 대해 말했습니까? ;-].
참고 URL : https://stackoverflow.com/questions/6111905/c-is-return-value-al-value
'developer tip' 카테고리의 다른 글
번들 이름, 실행 파일 이름, 제품 이름… (0) | 2020.11.02 |
---|---|
Python의 메시 그리드 함수 (meshgrid mgrid ogrid ndgrid) (0) | 2020.11.02 |
Kafka에 메시지를 보내는 데 키가 필요합니까? (0) | 2020.11.01 |
뷰 / 템플릿을 렌더링하기 전에 Angular 2가 모델을로드 / 해결할 때까지 기다립니다. (0) | 2020.11.01 |
.NET Core에서 WebUtility.HtmlDecode 대체 (0) | 2020.11.01 |