PowerPoint 프레젠테이션

Similar documents
PowerPoint 프레젠테이션

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

PowerPoint Template

K&R2 Reference Manual 번역본

금오공대 컴퓨터공학전공 강의자료

Microsoft PowerPoint - C++ 5 .pptx

Microsoft PowerPoint - additional01.ppt [호환 모드]

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

Microsoft PowerPoint - [2009] 02.pptx

chap10.PDF

쉽게 풀어쓴 C 프로그래밍

C++ Programming

C프로-3장c03逞풚

슬라이드 1

C++ Programming

Microsoft PowerPoint - Chapter 6.ppt

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

OCW_C언어 기초

Microsoft PowerPoint - 9ÀÏ°_ÂüÁ¶ÀÚ.ppt

쉽게 풀어쓴 C 프로그래밍

PowerPoint 프레젠테이션

The C++ Programming Language 4 장타입과선언 4.11 연습문제 Hello,world! 프로그램을실행시킨다. 프로그램이컴파일되지않으면 B3.1 을참고하자. #include<iostream> //#include 문, 헤더파일, 전처리지시

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

슬라이드 1

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

chap 5: Trees

Microsoft PowerPoint - Chap12-OOP.ppt

03장.스택.key

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을

설계란 무엇인가?

Modern Javascript

Microsoft PowerPoint - chap10-함수의활용.pptx

11장 포인터

Slide 1

PowerPoint Presentation

The C++ Programming Language 5 장포인터, 배열, 구조체 5.9 연습문제 다음의선언문을순서대로작성해보자. 문자에대한포인터, 10개정수의배열, 10개정수의배열의참조자, 문자열의배열에대한포인터, 문자에대한포인터에대한포인터, 상수정수, 상수


Microsoft PowerPoint - additional06.ppt [호환 모드]

Microsoft PowerPoint - chap04-연산자.pptx

Microsoft PowerPoint - chap12-고급기능.pptx

컴파일러

Microsoft PowerPoint - ch07 - 포인터 pm0415

C++-¿Ïº®Çؼ³10Àå

강의10

제 1 장 기본 개념

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

초보자를 위한 C# 21일 완성

유니티 변수-함수.key

class Sale void makelineitem(productspecification* spec, int qty) SalesLineItem* sl = new SalesLineItem(spec, qty); ; 2. 아래의액티비티다이어그램을보고 Java 또는 C ++,

Microsoft PowerPoint - Chapter 1-rev

PowerPoint Template

PowerPoint 프레젠테이션

Microsoft PowerPoint - CSharp-10-예외처리

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

JAVA PROGRAMMING 실습 08.다형성

C++ Programming

슬라이드 1

1. 인라인함수 예 : x, y 값중최소값을반환하는매크로와함수작성 // 매크로로구현한경우 #define MIN(X, Y) ((X) < (Y)? (X) : (Y)) X, Y 각각을괄호 ( ) 안에넣는이유는? // 함수로구현한경우 cout << MIN(4, 5) << en

02장.배열과 클래스

Microsoft PowerPoint - 8ÀÏ°_Æ÷ÀÎÅÍ.ppt

C# Programming Guide - Types

Lab 3. 실습문제 (Single linked list)_해답.hwp

untitled

untitled

11장 포인터

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - additional08.ppt [호환 모드]

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

Microsoft PowerPoint - chap03-변수와데이터형.pptx

PowerPoint 프레젠테이션

1. 클래스와배열 int 형배열선언및초기화 int ary[5] = 1, 2, 3, 4, 5 ; for (int i = 0; i < 5; i++) cout << "ary[" << i << "] = " << ary[i] << endl; 5 장클래스의활용 1

Analytics > Log & Crash Search > Unity ios SDK [Deprecated] Log & Crash Unity ios SDK. TOAST SDK. Log & Crash Unity SDK Log & Crash Search. Log & Cras

PowerPoint 프레젠테이션

1. 표준입출력 C++ : C의모든라이브러리를포함 printf, scanf 함수사용가능예 : int, double, 문자열값을입력받고출력하기 #include <cstdio> int ivar; double dvar; char str[20]; printf("int, dou

PowerPoint Presentation

Microsoft PowerPoint - chap-03.pptx

PowerPoint 프레젠테이션

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

Tcl의 문법

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

설계란 무엇인가?

BACK TO THE BASIC C++ 버그 헌팅: 버그를 예방하는 11가지 코딩 습관

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

PowerPoint 프레젠테이션

2002년 2학기 자료구조

슬라이드 1

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

untitled

Chapter 4. LISTS

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

C++ Programming

4. #include <stdio.h> #include <stdlib.h> int main() { functiona(); } void functiona() { printf("hihi\n"); } warning: conflicting types for functiona

OCW_C언어 기초

C 프로그래밊 개요

Transcription:

Rvalue Reference and constexpr 김경진 Microsoft MVP(Visual C++)

vector<vector<int>> user-defined literals thread_local vector<localtype> initializer lists template aliases constexpr lambdas []{ foo(); } unique_ptr<t> shared_ptr<t> weak_ptr<t> nullptr =default, =delete regex C++ raw string literals override, final auto i = v.begin(); thread, mutex for (x : coll) async atomic<t> variadic templates template <typename T > function<> strongly-typed enums enum class E { }; auto f() -> int array<t, N> noexcept decltype extern template unordered_map<int, string> delegating constructors rvalue references (move semantics) future<t> static_assert(x) tuple<int, float, string>

vector<vector<int>> user-defined literals thread_local vector<localtype> initializer lists constexpr template aliases lambdas []{ foo(); } unique_ptr<t> shared_ptr<t> weak_ptr<t> nullptr =default, =delete regex C++ raw string literals override, final auto i = v.begin(); thread, mutex for (x : coll) async atomic<t> variadic templates template <typename T > function<> strongly-typed enums enum class E { }; auto f() -> int array<t, N> noexcept decltype extern template unordered_map<int, string> delegating constructors rvalue references (move semantics) future<t> static_assert(x) tuple<int, float, string>

Agenda Rvalue Reference Move Semantics Perfect Forwarding constexpr

C 언어의 Lvalue & Rvalue Lvalue 대입연산자 (=) 를기준으로왼쪽과오른쪽에모두사용될수있는값 Lvalue = Left Value Rvalue 대입연산자 (=) 를기준으로오른쪽에만사용될수있는값 Rvalue = Right Value

C++ 의 Lvalue & Rvalue L 과 R 은더이상 Left, Right 를의미하지않음 Left, Right 개념은잊어버리고, Lvalue 와 Rvalue 를단순한 고유명사로기억하자 Lvalue Rvalue 표현식이종료된이후에도없어지지않고지속되는개체 ( 예 : 모든변수 ) 표현식이종료되면더이상존재하지않은임시적인개체 ( 예 : 상수, 임시객체 )

C++ 의 Lvalue & Rvalue 오른쪽코드에서 Rvalue 를찾아보자 #include <iostream> #include <string> using namespace std; int main() { int x = 3; const int y = x; int z = x + y; int* p = &x; cout << string("hello"); } ++x; x++;

C++ 의 Lvalue & Rvalue 오른쪽코드에서 Rvalue 를찾아보자 #include <iostream> #include <string> using namespace std; int main() { int x = 3; const int y = x; int z = x + y; int* p = &x; cout << string("hello"); } ++x; x++;

C++ 의 Lvalue & Rvalue Q. 그래도 Lvalue 인지 Rvalue 인지헷갈린다면?

C++ 의 Lvalue & Rvalue Q. 그래도 Lvalue 인지 Rvalue 인지헷갈린다면? A. 주소연산자 & 를붙여서에러가나면 Rvalue &(++x); &(x++); // error C2102: '&' requires l-value

Rvalue Reference (&& 참조자 ) 지금까지사용했던참조자 (&) 는 Lvalue 참조자 C++11 표준에 Rvalue를참조하기위한 Rvalue Reference가추가됨 Rvalue 참조자문법 type-id && cast-expression ex) int&& n = rvalue();

Rvalue Reference (&& 참조자 ) Lvalue Reference : Lvalue만참조가능 Rvalue Reference : Rvalue만참조가능 int rvalue() { return 10; } int main() { int lvalue = 10; } int& a = lvalue; int& b = rvalue(); int&& c = lvalue; int&& d = rvalue(); // error C2440 // error C2440

Rvalue Reference (&& 참조자 ) Q. Rvalue Reference 는 Lvalue 일까? Rvalue 일까?

Rvalue Reference (&& 참조자 ) Q. Rvalue Reference 는 Lvalue 일까? Rvalue 일까? A. Lvalue (Rvalue Reference Rvalue) 이후에나올내용을이해하는데중요한개념

Move Semantics 도입배경 코드곳곳에서발생하는불필요한 Rvalue 복사과정, 이로인한오버헤드 std::string a, b = "Hello ", c = "world"; a = b + c; std::string appendstring(std::string param); std::string result = appendstring("hello");

Move Semantics 도입배경 코드곳곳에서발생하는불필요한 Rvalue 복사과정, 이로인한오버헤드 std::string a, b = "Hello ", c = "world"; a = b + c; std::string 임시객체 std::string appendstring(std::string param); std::string result = appendstring("hello"); std::string 임시객체 std::string 임시객체

Move Semantics 도입배경 std::string a, b = "Hello ", c = "world"; a = b + c; std::string b + c (Rvalue) size = 12 H e l l o w o r l d Copy std::string a size = 12 H e l l o w o r l d

Move Semantics 도입배경 std::string a, b = "Hello ", c = "world"; a = b + c; std::string b + c (Rvalue) size = 0 H e l l o w o r l d std::string a size = 12 H e l l o w o r l d

Move Semantics 도입배경 std::string a, b = "Hello ", c = "world"; a = b + c; std::string b + c (Rvalue) size = 0 Move std::string a size = 12 H e l l o w o r l d

Move Semantics 도입배경 임시객체 (Rvalue) 의복사 이동이되는것이상식적인개념 하지만 C++11 이전에는이러한개념을언어수준에서구현할방법이없었음 C++11 에이르러객체의이동이라는개념이도입됨 Move Semantics

Move Semantics 구현 Q. 내코드에서 Move Semantics 를지원하려면?

Move Semantics 구현 Q. 내코드에서 Move Semantics 를지원하려면? A-1. Move 생성자, Move 대입연산자구현 MemoryBlock(MemoryBlock&& other); MemoryBlock& operator=(memoryblock&& other);

Move Semantics 구현 Demo

Move Semantics 구현 Q. 내코드에서 Move Semantics 를지원하려면? A-2. Rvalue Reference 를파라미터로받는함수작성 std::string operator+(std::string&& left, std::string&& right) {... } std::string s = std::string("h") + "e" + "ll" + "o";

변화된코딩패러다임 컨테이너에객체를삽입할때더이상포인터를넣지않아도됨 std::vector<memoryblock*> v1; std::vector<memoryblock> v2; vector 컨테이너와같은대규모리소스를반환하는함수작성가능 void createvector(std::vector<memoryblock>& v) {... } std::vector<memoryblock> createvector() {... }

std::move 함수 Q. std::move 함수가수행하는일은?

std::move 함수 Q. std::move 함수가수행하는일은? A. 파라미터를 무조건 Rvalue Reference 로타입캐스팅 template<class T> typename remove_reference<t>::type&& move(t&& _Arg) { return static_cast<remove_reference<t>::type&&>(_arg); } 절대이름에낚이지말자!! std::move 호출만으로는아무것도이동시키지않음

std::move 함수 Lvalue 를 Rvalue 로취급하고싶을때사용 ( 컴파일러에게해당객체가이동해도무관한객체임을알려주기위해 ) class Person { public: void setname(std::string&& newname) { name = newname; } Person(Person&& other) { name = other.name; } std::string name; };

std::move 함수 Lvalue 를 Rvalue 로취급하고싶을때사용 ( 컴파일러에게해당객체가이동해도무관한객체임을알려주기위해 ) class Person { public: void setname(std::string&& newname) { name = newname; Rvalue 복사발생 } Person(Person&& other) { name = other.name; Rvalue 복사발생 } std::string name; };

std::move 함수 Lvalue 를 Rvalue 로취급하고싶을때사용 ( 컴파일러에게해당객체가이동해도무관한객체임을알려주기위해 ) class Person { public: void setname(std::string&& newname) { name = std::move(newname); } Person(Person&& other) { name = std::move(other.name); } std::string name; };

&& 참조자의두얼굴 오른쪽코드에서 Rvalue Reference 를찾아보자 1 2 3 4 void foo(string&& param); string&& var1 = string(); auto&& var2 = var1; template<typename T> void foo(t&& param);

&& 참조자의두얼굴 1 void foo(string&& param); 오른쪽코드에서 Rvalue Reference 를찾아보자 2 3 Rvalue Reference (O) string&& var1 = string(); auto&& var2 = var1; Rvalue Reference (X) template<typename T> void foo(t&& param); 4 Rvalue Reference (O) Rvalue Reference (X)

&& 참조자의두얼굴 && 참조자가템플릿함수의템플릿파라미터또는 auto 타입과함께사용되었을경우 Universal Reference template<typename T> void foo(t&& param); Universal Reference auto&& var2 = var1; Universal Reference

Universal Reference Lvalue 와 Rvalue 를모두참조할수있는 포괄적 (Universal) 레퍼런스 반드시 Rvalue Reference 와구분되어야함 Perfect Forwarding 구현을위한열쇠

Universal Reference Lvalue 와 Rvalue 를모두참조할수있는 포괄적 (Universal) 레퍼런스 반드시 Rvalue Reference 와구분되어야함 Perfect Forwarding 구현을위한열쇠

Old C++ 에서는해결할수없는문제가하나있었다.

Forwarding Problem Old C++ 에서는해결할수없는문제가하나있었다.

Forwarding Problem make_shared 함수와같은 factory 함수작성 template<typename T, typename Arg> T* factory(arg& arg) { return new T(arg); } struct X { X(int& n) {} }; int n = 0; X* px = factory<x>(n);

Forwarding Problem make_shared 함수와같은 factory 함수작성 template<typename T, typename Arg> T* factory(arg& arg) { return new T(arg); } struct Y { Y(const int& n) {} }; // error C2664: cannot convert argument 1 from 'int' to 'int & Y* py = factory<y>(10);

Forwarding Problem 결국 non-const 버전과 const 버전을모두제공해야함 template<typename T, typename Arg> T* factory(arg& arg) { return new T(arg); } template<typename T, typename Arg> T* factory(const Arg& arg) { return new T(arg); }

Forwarding Problem 작성해야하는함수의개수는 2 n 으로증가 (n = 파라미터개수 ) 가변인자함수는답이없음

Forwarding Problem 작성해야하는함수의개수는 2 n 으로증가 (n = 파라미터개수 ) 가변인자함수는답이없음 하지만 Universal Reference 가출동하면어떨까?

Perfect Forwarding 1 단계 Universal Reference 를이용한구현 template<typename T, typename Arg> T* factory(arg&& arg) { return new T(arg); } int n = 0; X* px = factory<x>(n); // OK Y* py = factory<y>(10); // OK

템플릿타입추론규칙 template <typename T> void deduce(t&& param); int n = 0; deduce(n); // Lvalue 전달 : T -> int& 로추론 deduce(10); // Rvalue 전달 : T -> int 로추론

템플릿타입추론규칙 template <typename T> void deduce(t&& param); int n = 0; deduce(n); // Lvalue 전달 : T -> int& 로추론 deduce(10); // Rvalue 전달 : T -> int 로추론 void deduce(int& && param); Void deduce(int&& param); // Lvalue 전달 // Rvalue 전달

Reference Collapsing Rules Reference 경합 T& & T& && T&& & T&& && Reference 붕괴 T& T& T& T&& void deduce(int& param); Void deduce(int&& param); // Lvalue 전달 // Rvalue 전달

Perfect Forwarding 2 단계 마지막으로해결해야할문제 Lvalue Lvalue, Rvalue Rvalue 로전달해야완벽한포워딩 template<typename T, typename Arg> T* factory(arg&& arg) { return new T(arg); }

Perfect Forwarding 2 단계 마지막으로해결해야할문제 Lvalue Lvalue, Rvalue Rvalue 로전달해야완벽한포워딩 template<typename T, typename Arg> T* factory(arg&& arg) { return new T(std::forward<Arg>(arg)); }

std::forward 함수 파라미터를 조건에따라 Rvalue Reference 로타입캐스팅 Rvalue/Rvalue Reference 일경우에만 Rvalue Reference 로타입캐스팅 Reference Collapsing Rules 를이용 template<class T> T&& forward(remove_reference<t>::type&& _Arg) { return (static_cast<t&&>(_arg)); } 이것도이름에낚이지말자!! std::forward 호출만으로는아무것도전달하지않음

std::move 와 std::forward Q. 둘중어떤함수를사용해야할지헷갈린다면?

std::move 와 std::forward Q. 둘중어떤함수를사용해야할지헷갈린다면? A. Rvalue Reference 에는 std::move 함수, Universal Reference 에는 std::forward 함수사용

constexpr 핵심엿보기 컴파일타임처리 메타프로그래밍

컴파일타임과런타임 컴파일타임 컴파일러가바이너리코드를만들어내는시점 런타임 프로그램을실행하여실제로동작되는시점

컴파일타임처리 런타임에수행할작업을컴파일타임에미리수행하여상수화 컴파일시간은다소늘어나지만런타임퍼포먼스는증가

메타프로그래밍 프로그램에대한프로그래밍 예 ) Excel 의매크로함수, lex & yacc 구문분석기 C++ 메타프로그래밍 컴파일타임에처리되는일련의작업을프로그래밍하는것

메타프로그래밍 C++ 메타프로그래밍의목적 프로그램이실행되기전에최대한많은일을해둠으로써퍼포먼스증가 템플릿메타프로그래밍 난이도가높고, 가독성이떨어짐 constexpr 을이용하면아주쉽게메타프로그래밍가능

constexpr specifier const, static 과같은한정자 ( 변수, 함수에사용 ) 컴파일타임에값을도출하겠다 라는의미를가짐

constexpr 변수 변수의값을컴파일타임에결정하여상수화하겠다 라는의미 반드시상수식으로초기화되어야함 constexpr int n = 0; constexpr int m = std::time(null); // OK // error C2127

constexpr 함수 함수파라미터에상수식이전달될경우, 함수내용을 컴파일타임에처리하겠다 라는의미 constexpr int square(int x) { return x * x; } 전달되는파라미터에따라컴파일타임, 런타임처리가결정됨 int n; std::cin >> n; square(n); // 런타임처리 square(10); // 컴파일타임처리

constexpr 함수제한조건 함수내에서는하나의표현식만사용할수있으며, 반드시리터럴타입을반환해야함 constexpr LiteralType func() { return expression; }

constexpr 함수로변환 if / else 구문 for / while 루프 변수선언

constexpr 함수로변환 if / else 구문 삼항연산자 (x > y? x : y) for / while 루프 재귀호출 변수선언 파라미터전달

2~n 소수의합구하기 bool IsPrime(int number) { if (number <= 1) return false; for (int i = 2; i * i <= number; ++i) if (number % i == 0) return false; } return true; int PrimeSum(int number) { int sum = 0; for (int i = number; i >= 2; --i) if (IsPrime(i)) sum += i; } return sum;

IsPrime 템플릿메타프로그래밍버전 struct false_type { typedef false_type type; enum { value = 0 }; }; struct true_type { typedef true_type type; enum { value = 1 }; }; template<bool condition, class T, class U> struct if_ { typedef U type; }; template <class T, class U> struct if_ < true, T, U > { typedef T type; }; template<size_t N, size_t c> struct is_prime_impl { typedef typename if_<(c*c > N), true_type, typename if_ < (N % c == 0), false_type, is_prime_impl<n, c + 1> > ::type > ::type type; enum { value = type::value }; }; template<size_t N> struct is_prime { enum { value = is_prime_impl<n, 2>::type::value }; }; template <> struct is_prime <0> { enum { value = 0 }; }; template <> struct is_prime <1> { enum { value = 0 }; };

IsPrime 템플릿메타프로그래밍버전

constexpr 을이용한메타프로그래밍 Demo

constexpr 관련라이브러리 Sprout C++ Libraries (Bolero MURAKAMI) http://bolero-murakami.github.io/sprout/

C++14 constexpr 제한조건완화 변수선언가능 (static, thread_local 제외 ) if / switch 분기문사용가능 range-based for 루프를포함한모든반복문사용가능

Summary 키워드 Rvalue 내용 표현식이종료되면사라지는임시적인개체 Rvalue Reference && 참조자를사용하여 Rvalue 참조가능 Move Semantics 객체의이동, Move 생성자, Move 대입연산자구현 Perfect Forwarding Universal Reference, std::forward 함수이용 constexpr 컴파일타임처리, 메타프로그래밍

참고자료 Effective Modern C++ (Scott Meyers) http://blogs.embarcadero.com/jtembarcadero/2012/11/12/my-top-5-c11-language-and-library-features-countdown/ http://msdn.microsoft.com/en-us/library/dd293668.aspx http://blogs.msdn.com/b/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part-2.aspx http://msdn.microsoft.com/en-us/library/dd293665.aspx http://www.codeproject.com/articles/397492/move-semantics-and-perfect-forwarding-in-cplusplus http://www.codeproject.com/articles/453022/the-new-cplusplus-rvalue-reference-and-why-you http://kholdstare.github.io/technical/2013/11/23/moves-demystified.html http://en.cppreference.com/w/cpp/language/constexpr http://blog.smartbear.com/c-plus-plus/using-constexpr-to-improve-security-performance-and-encapsulation-in-c/ http://www.codeproject.com/articles/417719/constants-and-constant-expressions-in-cplusplus http://cpptruths.blogspot.kr/2011/07/want-speed-use-constexpr-meta.html http://enki-tech.blogspot.kr/2012/09/c11-compile-time-calculator-with.html http://en.wikipedia.org/wiki/c%2b%2b14