2011-10-19 3 views
2

아래의 주석 처리 된 행의 실행 순서가 보장됩니까? 내 컴파일러와쉼표로 구분 된 명령문의 반환 값 수명

struct S 
{ 
    S() { /* called 1st */ } 
    ~S() { /* called 3rd */ } 
}; 

boost::shared_ptr<S> f() 
{ 
    return boost::shared_ptr<S>(new S); 
} 

int second() { return 0; /* called 2nd */ } 

int test() 
{ 
    return (f(), second()); 
} 

f()에 의해 반환되는 shared_ptrsecond()가 호출 될 때까지 지속될 것으로 보인다. 그러나 이것은 표준 컴파일러와 다른 컴파일러에 의해 보장됩니까?

+0

[임시 직원의 수명] 가능한 복제본 (http://stackoverflow.com/questions/4214153/lifetime-of-temporaries) – fredoverflow

답변

7

.

임시 직원은 full-expression이 완료 될 때까지 유지됩니다.

[n3290: 12.2/3]: 구현은 비 단순 생성자 (12.1, 12.8 )이 클래스의 객체 임시 도입

, 그것은 생성자 임시 개체라는 것을 보장한다. 비슷하게 소멸자는 과 사소한 소멸자 (12.4)를 임시로 호출해야한다. 임시 개체는 (완전하게) 에 생성 된 지점이 포함 된 전체 식 (1.9)을 평가하는 마지막 단계로 소멸됩니다. 평가에서 예외가 throw되는 경우에도 마찬가지입니다. 임시 개체를 삭제할 때의 값 계산 및 부작용은 전체 표현식과 관련이 있으며 특정 하위 표현식과 관련이 없습니다.

그리고 :

[n3290: 1.9/10]:전체 표현을 다른 표현의 표현식하지 않은 표현이다. 언어 구조가 함수의 암묵적인 호출을 생성하기 위해 정의 된 인 경우 언어 구문의 사용은이 정의의 표현의 것으로 간주됩니다. 임시 개체가 아닌 수명이 끝날 때 생성 된 소멸자에 대한 호출은 암시적인 전체 식입니다. 의 표현식 결과에 적용된 변환은 표현식이 나타나는 언어 구문의 요구 사항을 충족하기 위해 전체 표현식의 일부로 간주됩니다. [...]

f()second() 모두 후자의 평가 결과에 test()에서 실행 돌아갈 때까지 존재한다는 것을 의미한다.