constexpr

Modern C++에 적응하기
Effective Modern C++ Chapter 3. constexpr


constexpr

constexpr은 해당 값이 const일 뿐만 아니라, 컴파일 타임 에 평가될 수 있음을 의미한다.

constexpr로 선언된 객체는 const이며, 그 값은 컴파일 타임에 정해진다. 따라서 컴파일 타임 이후에 평가되는 값으로 초기화할 수 없다.

1
2
3
4
5
int sz;
...

constexpr auto arrSize1 = sz; // error
constexpr auto arrSize2 = 10; // OK

컴파일 타임에 정해진 상수이므로 배열의 길이나 템플릿 인수 등, 정수 상수 표현식 에 사용할 수 있다.

Read more

iterator vs const_iterator

Modern C++에 적응하기
Effective Modern C++ Chapter 3. iterator vs const_iterator


iterator vs const_iterator

const를 사용하는 것이 의미가 있는 경우에는 항상 const를 사용하는 것이 바람직하다. iterator도 마찬가지이다.


C++98에서 const_iterator는 사용하기가 상당히 까다로웠다.
먼저 non-const 컨테이너로부터 const_iterator를 얻는 간단한 방법이 없었다.

1
2
3
4
5
6
7
8
9
10
typedef std::vector<int>::iterator IterT;
typedef std::vector<int>::const_iterator ConstIterT;

std::vector<int> values;
...

ConstIterT ci =
std::find(static_cast<ConstIterT>(values.begin()),
static_cast<ConstIterT>(values.end()),
1983);
Read more

Enum class

###DESCRIPTION_HERE###


enum class

enum class는 기존 enum의 문제점들을 보완하기 위해 등장하였다.

scope

enum에 선언된 내용은 enum과 같은 scope 범위를 갖는다.

1
2
3
enum Color { black, white, red };
...
int red = 0; // error
Read more

Alias declaration

Modern C++에 적응하기
Effective Modern C++ Chapter 3. Alias declaration


alias declaration

C++98의 typedef보다 더욱 직관적이고 효과적인 type declaration 이 C++11에 도입되었다.

1
2
3
using UptrMapSS = std::unique_ptr<std::unordered_map<std::string, std::string>>;

using FP = void (*)(int, const std::string&);

type declaration 은 템플릿화 할 수 있다.

Read more

Uniform initialization

Modern C++ 을 사용하면서 쉽게 지나치기 쉬운 새로운 기능들
중괄호 초기화


객체 초기화 방식

C++11에서 객체를 초기화하는 방법

1
2
3
4
int x( 0 ); 
int y = 0;
int z{ 0 };
int w = { 0 }; // 대체로 int w{ 0 }; 와 같음

객체의 초기화 과정에서 '='를 사용하는 초기화는 할당연산자(assignment operator)가 아닌 복사생성자(copy constructor)를 호출한다.


Read more

auto in C++

C++ auto 키워드에 대해서
Effective Modern C++ Chapter 2.


auto vs implicit type

변수 초기화

auto는 변수의 선언과 동시에 초기화를 강제할 수 있다.

1
2
3
4
int x;      // 선언되었지만 초기화되지 않음.

auto x; // error!
auto x = 0; // OK. 선언과 동시에 초기화 됨

Read more

C++ Type deduction

C++ 에서의 형식 연역
Effective Modern C++ Chapter 1.


Type deduction in template

1
2
3
4
template <typename T>
void f(ParamType param);

f(expr);

위 코드는 컴파일 단계에서 expr로 부터 TParamType에 대한 형식 연역이 이루어진다. 이때 T의 형식 연역은 exprParamType에 영향을 받는다.



ParamType이 l-value ref 인 경우

Read more