Programing

함수 반환 값은 자동 개체이므로 소멸이 보장됩니까?

crosscheck 2020. 12. 31. 22:49
반응형

함수 반환 값은 자동 개체이므로 소멸이 보장됩니까?


[except.ctor]에서 표준 ( N4140 )은 다음을 보장합니다.

... try 블록이 입력 된 이후 생성 된 모든 자동 객체에 대해 소멸자가 호출됩니다.

그러나 다음 예제에서 빈 출력 은 함수 foo가 생성되었지만 함수의 반환 값이 파괴되지 않았 음을 증명합니다 . g ++ (5.2.1) 및 clang ++ (3.6.2-1) 및 options를 사용하여 컴파일되었습니다 -O0 -fno-elide-constructors -std=c++14.

struct A { ~A() { cout << "~A\n"; } };

struct B { ~B() noexcept(false) { throw 0; } };

A foo() {
  B b;
  return {};
}

int main() {
  try { foo(); }
  catch (...) { }
}

이것은 g ++ 및 clang ++ 모두의 버그입니까, 아니면 함수 반환 값이 자동 객체로 간주되지 않습니까? 아니면 C ++ 언어의 루프 홀입니까?

[stmt.return], [expr.call] 또는 [dcl.fct]에서 함수 반환 값이 자동 개체로 간주되는지 여부에 대한 명확한 설명을 찾을 수있었습니다. 내가 찾은 가장 가까운 힌트는 6.3.3 p2입니다.

... return 문에는 임시 개체의 구성 및 복사 또는 이동이 포함될 수 있습니다.

및 5.2.2 p10 :

함수 호출은 결과 유형이 lvalue 참조 유형이거나 함수 유형에 대한 rvalue 참조 인 경우 lvalue이고, 결과 유형이 객체 유형에 대한 rvalue 참조 인 경우 xvalue, 그렇지 않으면 prvalue입니다.


함수 반환 값은 임시로 간주되며 반환 값의 구성은 지역 정보가 삭제되기 전에 순서가 지정됩니다.

불행히도 이것은 표준에 명시되어 있지 않습니다. 이를 설명하고 문제를 해결하기위한 문구를 제공 하는 공개 결함 이 있습니다.

[...] void 유형의 피연산자가있는 return 문은 반환 유형이 cv void 인 함수에서만 사용됩니다. 다른 피연산자가있는 return 문은 반환 유형이 cv void가 아닌 함수에서만 사용됩니다. return 문은 피연산자에서 복사 초기화 (8.5 [dcl.init])에 의해 반환 될 객체 또는 참조를 초기화합니다. [...]

반환 된 엔터티의 복사 초기화는 return 문의 피연산자에 의해 설정된 전체 표현식의 끝에서 임시 파일이 삭제되기 전에 순서가 지정되며, 차례로 지역 변수가 삭제되기 전에 순서가 지정됩니다 (6.6 [stmt. jump])를 반환합니다.

함수 반환 값은 일시적이므로 destructors are invoked for all automatic objects게시물 시작 부분에 따옴표 가 포함되지 않습니다 . 그러나 [class.temporary]/3말한다 :

[...] 임시 객체는 (어휘 적으로) 생성 된 지점을 포함하는 전체 표현식을 평가하는 마지막 단계로 삭제됩니다. 평가가 예외를 던지는 것으로 끝나더라도 마찬가지 입니다. [...]

그래서 나는 이것을 GCC와 Clang의 버그라고 생각할 수 있다고 생각합니다.

소멸자에서 던지지 마십시오.)


이것은 버그이며 MSVC는 실제로 "~ A"를 인쇄합니다.


코드를 수정했고 이제 출력에서 ​​A가 파괴되지 않았 음을 알 수 있다고 생각합니다.

#include<iostream>

using namespace std;

struct A {
    ~A() { cout << "~A\n"; }
    A() { cout << "A()"; }
};

struct B {
    ~B() noexcept( false ) { cout << "~B\n"; throw(0); }
    B() { cout << "B()"; }
};

A foo() {
    B b;
    return;
}

int main() {
    try { foo(); }
    catch (...) {}
}

출력은 다음과 같습니다.

B () A () ~ B

네, 버그 일 수 있습니다.

참조 URL : https://stackoverflow.com/questions/34673460/are-function-return-values-automatic-objects-and-thus-guaranteed-to-be-destructe

반응형