방프리

25.02.10 최신 C++ 개념 1일차 본문

C++/고성능을 위한 언어 C++

25.02.10 최신 C++ 개념 1일차

방프리 2025. 2. 10. 23:17

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