※ C++의 버전변화

C++98, C++03  ==>  C++11  ==>  C++14 ...

 

C++11: 기존 C++98에서 람다 표현식을 지원한 것

C++14: 일반화된 함수반환 형식 유추를 지원한 것

 

 

※ C++11/14 문법적 변경 사항

1. 초기화 리스트 및 초기화 방법의 통합

2. 새로운 타입의 추가 : long long형 정수

3. 새로운 스마트 포인터 추가 

4. 널 포인터 상수 추가 : nullptr

5. 열거체의 범위 지정

6. 자동 타입 변환 : auto

7. 타입 변환 연산자 추가 : explicit

8. 범위 기반 for 문 추가

9. 람다 함수와 람다 표현식 추가

 

 

※ C++11/14  표준 라이브러리 변경 사항

1. 확장할 수 있는 난수 생성기의 추가 : random 헤더 파일

2. 튜플 템플릿의 추가: tuple 헤더 파일

3. 정규 표현식의 추가 : regex 헤더 파일

4. 다중 프로그래밍을 위한 스레드의 지원 : thread_local 키워드, automic 헤더 파일

5. 임베디드 프로그래밍을 위한 저수준 프로그래밍 지원

 

 

※ C++11의 move semantics

C++11에서 가장 널리 쓰이는 기능은 바로 이동 의미론이다. (move semantics)

이동의미론l-value와 r-value가 구분된다는 점에서 유용하다.

l-value: 이름, 포인터, 왼값 참조를 통해 지칭할 수 있는 객체 (주소를 취할 수 있음)

r-value:이동연산이 가능한 객체를 가리킴 (함수가 돌려준 임시객체)

class Widget {
public:
    Widget (Widget&& rhs);  // rhs의 형식은 r-value참조, rhs 자체는 l-value
};

여기서 유의할 점은 rvalue 참조 형식의 매개변수지만 매개변수자체는 lvalue이다.

Widget의 이동생성자 안에서 rhs의 주소를 취하고 있기 때문이다.

 

 

※ 복사생성자를 통해 생성된 복사본 vs 이동생성자를 통해 생성된 복사본

이 둘을 구분하는 용어는 없다. 아래 예시를 보면

대체로 rvalue 복사는 이동생성자로 생성되고 lvalue 복사는 복사생성자로 생성된다.

호출지점에서 함수에 전달하는 표현식을 argument, 인자라 하고 

인수는 함수의 매개변수, parameter를 초기화하는데 사용된다.

매개변수는 l-value이지만 매개변수의 초기화에 쓰이는 인수는 l,rvalue 둘 다 가능하다.

 

 

 

 

 

 

 

 

※  C++과 람다 표현식

람다표현식으로 만들어진 함수객체를 closure라 부른다.

람다표현식과 그로부터 생성된 클로저를 구분해야하는 경우는 드물다.

또한 함수템플릿과 템플릿함수를 구분하는 경우도 드물다. (클래스 템플릿과 템플릿 클래스도 마찬가지)

 

C++에서 함수는 크게 2가지로 나뉜다.

- 일반함수(General Function): 일반적인 반환타입을 갖는 함수

- 무명함수(Anonymous Function): 람다(Lambda)이지만 함수객체처럼 함수의 이름없이 사용가능한 함수

int main() {
    // 람다식 선언
    auto Func1 = [] {
        cout << "Hello, Lambda" << endl;
    };
    
    // 람다식 인수로 int n 선언
    auto Func2 = [](int n){
        cout << "val = " << n << endl;   
    };
    
    Func2(2);
}

람다는 일반 함수처럼 사전에 선언문과 정의문 없이 하나의 문장 || 다수의 문장으로 직접 정의하고 실행시킬 수 있다.

이런 람다는 1~2번 작업을 위한 임시적인 함수를 만드는데 적합하다.

 

 

※ 람다 만드는 법

[캡쳐절] { 본문 }
[캡쳐절] (인수) { 본문 }
[캡쳐절] (인수)->반환타입{ 본문 }
[캡쳐절] (인수) mutable(옵션) constexpr(옵션) 예외(옵션) 속성(옵션) -> 반환타입{ 본문 }

마지막은 C++17이후 추가된 람다형식이다. 이를 아래와 같이 표현할 수 있다.

[캡쳐 리스트](인수) mutable(optional) constexpr(optional) 예외속성 -> 반환데이터타입{ 본문 }

 

 

 

1. 캡쳐절 (Capture Clause)

람다는 일반함수에 없는 캡쳐절이 존재한다.

 

2. 인수 리스트 (Parameter List)

람다는 일반함수에 없는 캡쳐절이 존재한다.

 

3. mutable (옵션)

람다는 일반함수에 없는 캡쳐절이 존재한다.

 

4. constexpr (옵션)

람다는 일반함수에 없는 캡쳐절이 존재한다.

 

5. throw (옵션)

람다는 일반함수에 없는 캡쳐절이 존재한다.

 

6. Attribute(옵션)

람다는 일반함수에 없는 캡쳐절이 존재한다.

 

7. 반환 데이터 타입 (옵션)

람다는 일반함수에 없는 캡쳐절이 존재한다.

 

8. 본문

람다는 일반함수에 없는 캡쳐절이 존재한다.

 

 

+ Recent posts