Nice programing

C ++ : 임시 인수의 수명?

nicepro 2020. 11. 23. 20:01
반응형

C ++ : 임시 인수의 수명?


다음 MyClass과 같이 함수에 대한 인수로의 새 인스턴스를 만들 때 :

class MyClass
{
  MyClass(int a);
};    

myFunction(MyClass(42));

표준은 소멸자의시기에 대해 피부 여자를 만드는가?
특히,에 대한 호출 후 다음 문 전에 호출 될 것이라고 가정 할 수 myFunction()있습니까?


임시 개체는 해당 개체가 속한 전체 표현이 끝나면 소멸됩니다.

전체 표현식은 다른 표현식의 하위 표현식이 아닌 표현식입니다. 일반적으로이가에서 끝을 의미합니다 ;(또는 )대한 if, while, switch문장의 끝을 나타내는 등). 귀하의 예에서는 함수 호출의 끝입니다.

참조에 바인딩하여 임시 파일의 수명을 연장 할 수 있습니다 const. 이렇게하면 수명이 참조 수명으로 연장됩니다.

MyClass getMyClass();

{
  const MyClass& r = getMyClass(); // full expression ends here
  ...
} // object returned by getMyClass() is destroyed here

반환 된 객체를 변경할 계획이없는 MyClass obj = getMyClass();경우 반환 값 최적화가 적용되지 않은 경우 복사 생성자 호출 (와 비교 ) 을 저장하는 좋은 방법입니다 . 불행히도 잘 알려지지 않았습니다. (하지만 C ++ 11의 이동 의미론이 덜 유용하다고 생각합니다.)


모든 사람이 12.2 / 3 또는 이와 유사한 것을 올바르게 인용했으며 귀하의 질문에 답합니다.

임시 객체는 (어휘 적으로) 생성 된 지점을 포함하는 전체 표현식을 평가하는 마지막 단계로 삭제됩니다.

나는 것을 즐겁게 찾을 다음 페이지에 걸쳐 12.2 / 4는 말한다, 표준의 내 인쇄에 :

full-expression의 끝과 다른 지점에서 임시가 소멸되는 두 가지 컨텍스트가 있습니다.

둘 다 귀하의 예제에 적용되지 않으며 둘 다 이니셜 라이저에서 임시 사용과 관련이 있습니다. 그러나 그것은 C ++ 표준과 같은 까다로운 짐승을 다룰 때 당신에 대한 지혜를 유지해야한다는 것을 보여줍니다.


이 표준은 실제로 보장을 제공합니다-섹션 12.2 / 5에서 :

함수 호출 (5.2.2)에서 참조 매개 변수에 대한 임시 바인딩은 호출을 포함하는 전체 표현식이 완료 될 때까지 지속됩니다.

그러나 코드에서 매개 변수가 참조로 전달되는지 값으로 전달되는지는 명확하지 않지만 어느 시점에서는 참조를 사용하는 복사 생성자가 사용됩니다.


섹션 12.2, 임시 객체, 조항 3에서 ANSI / ISO C 표준은 "... 임시 객체는 (어휘 적으로) 생성 된 지점을 포함하는 전체 표현식을 평가하는 마지막 단계로 파괴됩니다."

이것은 시퀀스 포인트 의 개념과 밀접한 관련이 있습니다. 시퀀스 포인트에 도달하면 표현식의 모든 부작용이 발생합니다.

참고 URL : https://stackoverflow.com/questions/2506793/c-life-span-of-temporary-arguments

반응형