2016-08-08 8 views
3

표준 C++ 11은 처음 세 기능을 수행하기 전에 3 개의 임시 객체가 모두 생성되었음을 보증합니까?표준 C++ 11은 함수 호출 전에 함수에 전달 된 임시 객체가 생성되었음을 보증합니까?

임시 객체로 전달 되더라도 :

  1. 객체
  2. r- 수치 참조
  3. 전달 부재 만 임시 객체

http://ideone.com/EV0hSP

#include <iostream> 
using namespace std; 

struct T { 
    T() { std::cout << "T created \n"; } 
    int val = 0; 
    ~T() { std::cout << "T destroyed \n"; } 
}; 

void function(T t_obj, T &&t, int &&val) { 
    std::cout << "func-start \n"; 
    std::cout << t_obj.val << ", " << t.val << ", " << val << std::endl; 
    std::cout << "func-end \n"; 
} 

int main() { 

    function(T(), T(), T().val); 

    return 0; 
} 

출력 :

T created 
T created 
T created 
func-start 
0, 0, 0 
func-end 
T destroyed 
T destroyed 
T destroyed 

작업 초안, 표준 프로그래밍 언어 C++ 2016년 7월 12일에 대한 : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf

§ 5.2.2 함수 호출

§ 5.2.2

1 A 함수 호출은 표현식 뒤에 공백이있을 가능성이있는 괄호 뒤에 쉼표로 구분 된 0123을 구성하는 이니셜 라이저 절의 목록 함수에 대한인수

그러나 T 중 하나가 을 만들 수 있습니다을 FUNC-시작?

또는 임시 개체를 만들기 전에 함수가 시작되도록 인수를 g/r/l/x/pr-value로 전달할 수있는 방법이 있습니까? [expr.call]/8에서

enter image description here

+0

나는 그 질문을 이해하지 못한다. 시체가 실행되기 시작했을 때 그 주장이 아직 존재하지 않는다면 어떻게 기능을 사용할 수 있습니까? –

+0

@underscore_d C++에서는 표준에 명확하게 설명 된 내용이 될 수 없습니다. 그러나 그것이 표준에 기술되어 있지 않다면 : ** 1. ** function()은 인라인 될 수 있습니다. ** 2 ** ** 객체는 함수의 일부 코드 이후에도이 객체의 처음 사용시에 생성 될 수 있습니다. 왜냐하면 컴파일러가 변경되지 않으면 모든 연산을 재정렬 할 수 있기 때문입니다. 관찰 가능한 동작 (/ 출력, 메모리 펜스, ...) - ** § 1.9 프로그램 실행 1, 5, 8 **. 인용구 : "컴파일러는 명령이나 연산을 자유롭게 재정렬 할 수 있습니다." http://stackoverflow.com/questions/30606924/can-function-calls-be-reordered – Alex

+0

맞습니다. # 2는 내가 이해하는 데 도움이되며, 서열화 요구 사항에 의해 배제되는 것으로 보이는 좋은 지적입니다. 저는 여전히 C++가 지연 초기화 객체를위한 네이티브 구문을 얻기를 기다리고 있습니다 ... # 1에 대해서, 여전히 인라인 될 수 있다고 확신합니까? 컴파일러는 3 개의 인자를 먼저 만들어야하고 (불확실하게 배열 됨) 인라인 된 몸체에 사용하도록 저장해야합니다. –

답변

11

[intro.execution]/16 :

착신 함수를 지시하거나, 후위 식 함수 (기능 인라인인지의 여부), 인수 발현과 연관된 모든 값 계산 및 부작용 호출 호출 된 함수 본문에있는 모든 식 또는 문을 실행하기 전에 순서가 지정됩니다.

7

우리가

[참고 있습니다 후위 표현과 인수의 평가입니다 서로에 대한 모든 unsequenced 상대를. 인수 평가의 모든 부작용은 함수가 입력되기 전에 순서가 정해집니다 (1.9 참조). -end note]

이것은 모든 매개 변수가 함수가 입력되기 전에 구성된다는 것을 의미합니다.

결과적으로 이것은 또한 함수가 종료 된 후에 모든 매개 변수가 파괴된다는 것을 보장합니다.