표준 C++ 11은 처음 세 기능을 수행하기 전에 3 개의 임시 객체가 모두 생성되었음을 보증합니까?표준 C++ 11은 함수 호출 전에 함수에 전달 된 임시 객체가 생성되었음을 보증합니까?
임시 객체로 전달 되더라도 :
- 객체
- r- 수치 참조
- 전달 부재 만 임시 객체
#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에서
나는 그 질문을 이해하지 못한다. 시체가 실행되기 시작했을 때 그 주장이 아직 존재하지 않는다면 어떻게 기능을 사용할 수 있습니까? –
@underscore_d C++에서는 표준에 명확하게 설명 된 내용이 될 수 없습니다. 그러나 그것이 표준에 기술되어 있지 않다면 : ** 1. ** function()은 인라인 될 수 있습니다. ** 2 ** ** 객체는 함수의 일부 코드 이후에도이 객체의 처음 사용시에 생성 될 수 있습니다. 왜냐하면 컴파일러가 변경되지 않으면 모든 연산을 재정렬 할 수 있기 때문입니다. 관찰 가능한 동작 (/ 출력, 메모리 펜스, ...) - ** § 1.9 프로그램 실행 1, 5, 8 **. 인용구 : "컴파일러는 명령이나 연산을 자유롭게 재정렬 할 수 있습니다." http://stackoverflow.com/questions/30606924/can-function-calls-be-reordered – Alex
맞습니다. # 2는 내가 이해하는 데 도움이되며, 서열화 요구 사항에 의해 배제되는 것으로 보이는 좋은 지적입니다. 저는 여전히 C++가 지연 초기화 객체를위한 네이티브 구문을 얻기를 기다리고 있습니다 ... # 1에 대해서, 여전히 인라인 될 수 있다고 확신합니까? 컴파일러는 3 개의 인자를 먼저 만들어야하고 (불확실하게 배열 됨) 인라인 된 몸체에 사용하도록 저장해야합니다. –