c++ - 파이썬 - 함수 매개 변수의 파손 순서는 무엇입니까?



function parameters (1)

이것은 이전 질문에 대한 후속 조치 입니다. 함수 인수의 파손 순서는 무엇입니까? 왜냐하면 실수로 인수를 매개 변수와 혼동했기 때문입니다. Columbo와 TC에게 감사의 말을 전합니다.

T_1 , ..., T_n 형의 매개 변수 p_1 , ..., p_n 을 갖는 일부 함수 f 의 몸체가 각각 예외를 던지면 종료되거나 리턴되며, 매개 변수가 파괴 된 순서는 무엇입니까? 가능한 경우 표준에 대한 참조를 제공하십시오.

예 :

template <typename ... Args>
void f(Args ... params) {} // in what order are params destroyed?

void f(T1 p1, T2 p2, T3 p3) {} // in what order are p1, p2 and p3 destroyed?

Answer #1

매개 변수가 파기되는 정확한 시점은 지정되지 않습니다 .

CWG는 매개 변수 객체가 호출 직후 또는 호출이 속한 전체 표현식의 끝에서 파기되는지 여부를 지정하지 않기로 결정했습니다.

매개 변수가 구성되는 순서는 지정되어 있지 않지만 함수 매개 변수에는 블록 범위가 있으므로 순서가 지정되지 않았더라도 파기는 역순으로 이루어 집니다. 예를 들어

#include <iostream>

struct A {
    int i;
    A(int i) : i(i) {std::cout << i;}
    ~A() {std::cout << '~' << i;} 
};

void f(A, A) {}

int main() {
    (f(0, 1), std::cout << "#");
}

GCC10#~0~1 , Clang은 01#~1~0 을 인쇄합니다. 이들은 서로 다른 순서로 매개 변수를 구성하지만 호출의 전체 표현식이 끝날 때 호출자에게 반환 된 직후가 아닌 생성의 역순으로 파기됩니다. VC ++는 10~0~1# 인쇄합니다 .





object-lifetime