나는대로 만든 Integer 클래스 이진 + 오버로드를 시도했다 :반환 객체의 두 가지 형태의 차이점은 무엇입니까?
const Integer operator+(const Integer& left,const Integer& right)
{
return Integer(left.i + right.i);
}
및
내가 첫 번째 경우에 일시적으로 Integer 객체가 생성되고 반환되며이었다 배운 것을 이제const Integer operator+(const Integer& left,const Integer& right)
{
Integer tmp(left.i + right.i);
return tmp;
}
두 번째 경우에는 생성자 호출을 사용하여 일반적인 객체를 생성 한 다음 복사 한 다음 소멸자를 호출합니다. Ecekl이 첫 번째로 말한 것은 컴파일러가 객체를 외부 반환 값의 위치에 직접 구축함으로써 이것을 이용한다는 것입니다. 우리는 이것을 어떻게 추론합니까? 반환 값 최적화에 대해 읽었지 만 위치 정보에 직접 복사하여 의미하는 바를 얻을 수 없습니다.
관련이 하나 개의 인수를 받아들이는 생성자는 일반적으로) 어색 암시 적 변환을 방지하기 위해
explicit
로 표시되기 때문에, 일반적으로 하지의 경우 , NRVO가 컴파일러에 의해 적절히 구현되었다고 제공된 것은 전혀 없습니다. – WhozCraig@WhozCraig : 사실 저는 (a + b) .g()와 같은 함수 호출을 원했습니다. 따라서 반환 값을 상수로 만들어야했습니다.이 경우 a + b는 상수 일 수 있기 때문입니다. –