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
'Nice programing' 카테고리의 다른 글
빈 / 널 값이있는 HashMap에 데이터를 키로 저장하는 것이 좋은 생각입니까? (0) | 2020.11.23 |
---|---|
파일 변경시 Firefox 자동 새로 고침을하려면 어떻게해야합니까? (0) | 2020.11.23 |
jQuery : 속성이 값보다 큰 모든 요소 선택 (0) | 2020.11.23 |
정규식을 사용하는 Scala 캡처 그룹 (0) | 2020.11.23 |
li : before {content : "■"; (0) | 2020.11.23 |