Point pt(1, 2);
Point (1, 2);
Temporary 특징
Point(1, 2).x = 10; // 컴파일 에러
객체를 함수 인자로만 사용한다면 Temporary로 전달하는게 효율적
void foo(const Point& pt); // 인자는 const 참조로 받아야함
int main()
{
// Point pt(1,2);
// foo(pt);
foo(Point(1, 2)); // foo(Point{1,2});
}
읽기 전용 문자열을 함수 인자로 받는 경우 const std::string& 보다 std::string_view가 좋음
void foo(const std::string& s);
void goo(std::string_view s); // 문자열의 주소와 길이로 접근
int main()
{
foo("Practive make perfect"); // 문자열의 복사본을 힙에 생성
goo("Practive make perfect"); // 이미 상수 메모리에 존재하는 문자열을 가리킴
}
return by value와 return by reference
Point pt(1, 2); // 전역변수
Point f3() // return by value
{
return pt;
}
Point& f4() // return by reference
{
return pt;
}
Point& f5() // 지역변수는 참조 반환 금지 (블럭이 벗어날 때 파괴되므로)
{
Point pt(1, 2);
return pt;
}
int main()
{
f3().x = 10; // Temporary 반환, 컴파일 에러
f4().x = 10; // 컴파일 성공, pt.x = 10
}
값 캐스팅과 참조 캐스팅
struct Base
{
int value = 10;
Base() = default;
Base(const Base& b) : value(b.value)
{
std::cout << "Base copy" << std::endl;
}
};
struct Derived : public Base
{
int value = 20;
};
int main()
{
Derived d;
std::cout << d.value << std::endl; // 20, Derived의 value를 꺼냄
std::cout << static_cast<Base&>(d).value << std::endl; // 10, Base의 value를 꺼냄
std::cout << static_cast<Base>(d).value << std::endl; // 10, Base 타입의 Temporary 생성하며 복사 생성자 호출
static_cast<Base&>(d).value = 100; // lvalue
// static_cast<Base>(d).value = 100; // 컴파일 에러, temporary
}