방프리
25.02.10 최신 C++ 개념 1일차 본문
1. 변수에서의 auto 사용
- auto는 지역 변수에 대해 좌에서 우로 초기화하는 방식으로 사용하는 것을 선호 ex) auto i = 0;
- 이동 불가능한 유형이나 복사 불가능한 유형에도 적용 가능
2. const 참조
- const auto&와 같이 나타나는 const 참조는 어느 것과도 바인드가 가능
- const 참조는 수정을 원하지 않는 변수에 대한 기본적인 선택이어야 함
auto func()
{
auto foo = Foo {};
auto& cref = foo.cref(); // cref는 const 참조
auto& mref = foo.mref(); // mref는 변경 가능한 참조
}
3. 가변 참조
- const 참조와 반대로 임시 객체와 바인드가 되지 않음
- auto&는 가변 참조를 표시하여 사용
4. 전달 참조
- auto&&로 표기, 어떤 것과도 바인드할 수 있고 일부 상황에서 특히 유용
- const 참조와 동일하게 임시 객체의 수명을 확장하지만 auto&&는 임시 객체를 포함한 해당 객체 참조의 변경 허용
5. C++ 람다 함수의 기본 구문
- 변수를 전달하듯 함수를 정규함수에 전달함
// ready to container
auto vals = std::vector<int>{ 1, 3, 2, 5, 4 };
autu num_3 = std::count(vals.begin(), vals.end(), 3);
auto num_above_3 = std::count_if(vals.begin(), vals.end(), [](int v) { return v > 3; });
6. 캡쳐 블록
- 람다에 외부 변수를 대신 사용하려면?
auto count_value_above(const std::vector<int>&vals, int th)
{
auto is_above = [th](int v) { return v > th; };
return std::count_if(vals.begin(), vals.end(), is_above);
}
auto is_above = [&th](int v) { return v > th; };
7. 람다 멤버 면수 변경
- 람다에서 멤버 변수를 변경하려면 람다를 선언할 때 mutable을 지정
- 람다 함수에서 mutable 수식어는 일반적인 클래스 멤버 함수에서의 const에 반대되는 개념으로 동작
- 클래스 멤버 함수와는 대조적으로 람다 함수에서는 const가 기본
- 람다의 변경은 명시적으로 지정
8. 한꺼번에 캡쳐
- [=] 혹은 [&]을 넣어 범위 내의 모든 변수를 캡쳐 가능
- [=]을 사용하면 모든 변수가 값으로 캡쳐되고, [&]을 사용하면 모든 변수를 참조로 캡처
- 클래스 내부일 경우 [this].를 사용하면 참조로 모든 클래스 멤버 변수 캡쳐 가능 [*this]로 복사 캡처 가능
class Foo
{
public:
auto member_function()
{
auto a = 0;
auto b = 1.0f;
// 복사로 모든 변수 캡처
auto lambda_0 = [=]() { std::cout << a << b << m_; };
// 참조로 모든 변수 캡처
auto lambda_1 = [=]() { std::cout << a << b << m_; };
//참조로 멤버 변수 캡처
auto lambda_2 = [this]() { std::cout << m_; };
//복사로 멤버 변수 캡처 ( C++ 17 이후)
auto lammbda_3 = [*this]() { std::cout << m_; };
}
private:
int m_{};
};
Comments