developer tip

C ++ : 반환 값은 L- 값입니까?

copycodes 2020. 11. 2. 08:06
반응형

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

반응형