본문 바로가기

프로그래밍/C/C++

c++ 11, 14

왼값, 오른값 쉽게 판별법

일반적으로, 주소를 취할수 있다면 ★왼값★

주소를 취할 수 없다면 ★오른값★


class Widget {

public:

Widget(Widget&& rhs); // rhs 의 형식은 오른값 참조이지만, rhs 자체는 왼값이다.

}



auto

1. 템플릿에 대한 형식 연역을 기반으로 작동


template<typename T>

void f(const ParamType& param);

f(expr); // T 표현식으로 f 호출

-> ParamType, param 두가지를 각각 연역한다.

ParamType -> const ParamType& 

param -> int



delete 키워드 적극 사용 권장.

private:

widget(const widget&); // not defined

widget& operator=(const widget&); // not defined

부작용 -> friend 함수에서 widget 객체를 복사하는 시점에 컴파일 실패 (링크시점에 발견됨-빡침)



public:

widget(const widget&) = delete;

widget& operator=(const widget&) = delete;

직관적이다. 바로 컴파일 실패내줌, 깔끔함.



override -> 적극 사용 권장


기반 클래스는 가상 함수여야하고, 기반 함수와 파생 함수 완벽 일치 해야 함.

parent class

virtual void m() &;


child class

virtual m() &&;

안된다. 빌드 에러도 안난다 ㅡㅡ (누가 저렇게 써둔거 발견하면 개빡침)


parent class

virtual void m() &;


child class

virtual m() && override; // 재정의할때는 꼭 override 를 써주자. 빌드 에러라도 보게


또한

parent class

virtual void m() & override; // 상위 클래스에서 override를 해주면, child에서 override를 안했을경우 컴파일러가 지적해줌. 편함



noexcept; 선언

int f(int x) throw();

int f(int x) noexcept;

noexcept 를 적용하면 컴파일러가 더 좋은 object code를 만들 수 있다.


c++98에서는 예외 명세가 위반되면 호출 스택이 f를 호출한 지점에 도달할때까지 풀린다.

c++11은 풀릴수도 있고, 안풀릴수도 있다.

noexcept를 선언하면 컴파일러의 최적화기는 실행시점 스택을 풀기 가능 상태로 유지 할 필요가 없다.

또한 반드시 생성의 반대 순서로 파괴해야 하는것도 아니다.


그러나 throw는 그런 최적화 유연성이 없고, 예외명세가 아예 없는 함수역시 그런 유연성이 없다.



std::lock_guard<std::mutex> g(m); // 이거 좋다 자동 지역

++callcout // 이거도 좋다. // 그러나 하나의 변수 또는 하나의 메모리 장소를 다룰때만 적합.

private:

mutable std::mutex m;

mutable std::atomic<unsigned> callcount{0};

volatile -> 컴파일러 최적화 방지

explicit -> 묵시적변환 금지

mutable -> const 로 선언된 함수 내에서 값 변경 가능.









'프로그래밍 > C/C++' 카테고리의 다른 글

c++ 11, 14 shared_ptr  (0) 2017.06.13
c++ 11, 14 unique_ptr  (0) 2017.06.13
c++ 11, 14 for, auto  (0) 2016.08.07
c++ 11, 14, constexpr  (0) 2016.08.06
람다, 클로져, Closure, 람다함수 사용법  (0) 2013.07.23