표현식의 평가 과정에서 잠깐 만들어졌다가, 그 표현식이 끝나면 바로 파괴되는 객체를 말합니다.
임시 객체(Temporary object)는 C++ 표준에서 사용되는 공식적인 용어로, 객체의 수명(lifetime)이 특정 표현식이나 문맥에 한정된다는 점을 강조합니다.
또한 익명 객체(Anonymous object)라고도 불리며 이름이 없다(anonymous)는 점을 강조하는 비공식적인 용어입니다.
또한 비공식으로 임시 변수(Temporary variable) 또는 익명 변수(Anonymous variable)라고도 불립니다.
반환 값 최적화(Return Value Optimization, RVO)
임시 객체(Temporary object)를 반환할 때 적용되는 최적화로
함수가 익명 객체를 return할 때, 원래라면 복사 생성자(또는 이동 생성자)가 호출되어야 하는데
이를 건너뛰고 바로 호출자(call site) 쪽에서 객체를 직접 생성하는 방식으로 최적화합니다.C++17 이후 무조건 적용
명명된 반환 값 최적화(Named Return Value Optimization, NRVO)
이름이 붙은 지역 변수(named local variable)를 반환할 때 적용되는 최적화로
함수 안에서 지역 변수를 만들고 그걸 return할 때, 이 경우에도 호출자 영역에서 직접 생성되도록 최적화합니다.NRVO는 모든 경우에 적용되는 것은 아니며 컴파일러의 재량에 달려 있어서 "걸리면 좋은 보너스" 정도로 생각하고 코드를 짜야 합니다.
#include <vector>
std::vector<int> getNumbers() {
return std::vector<int>{1, 2, 3, 4}
// 여기서 std::vector<int>{1, 2, 3, 4}가 임시 객체
// C++11 이후부터는 return {1, 2, 3, 4}; 형식으로도 가능
}
int main() {
std::vector<int> v = getNumbers(); // 반환된 임시 객체 → v에 대입
}
#include <string>
int main() {
std::string a = "Hi, ";
std::string b = "there";
std::string result = a + b;
// operator+의 결과는 temporary std::string
}
int main() {
double d = 3;
// int 3 → double 3.0 임시 객체로 변환됨
}
#include <string>
#include <vector>
int main() {
const std::string& sref = std::string("temporary");
// temporary std::string이 sref의 수명과 동일하게 연장됨
const std::vector<bool>& vref = std::vector<bool>(10, false);
// temporary std::vector<bool>이 vref의 수명과 동일하게 연장됨
}
#include <iostream>
#include <string>
void print(const std::string& s) {
std::cout << s << '\n';
}
int main() {
print(std::string("hello"));
// 인자로 넘어가는 std::string("hello")가 temporary
}