C++0x는 GCC 4.5, VS2010 부터 정식 지원.
참고자료
http://download.microsoft.com/download/1/9/4/194B6F74-8A72-482D-AF0E-31CE9D855372/VisualC.PDF
류광의 번역이야기 - c++0x 글모음 : http://occamsrazr.net/tt/tag/C++0x
Visual Studio 2010 공식 팀 블로그 : http://vsts2010.net/category/C++0x
C++0x FAQ : http://www2.research.att.com/~bs/C++0xFAQ.html
auto
컴파일 타임에 Type 결정
static_assert
컴파일 타임의 assert
RValue Reference (우측 값 참조)
좌측 값 : 식이 끝난 후 계속 존재하는 값. Ex) int& LValue = var;
우측 값 : 식이 끝난 후 존재하지 않는 임시 값. Ex) int&& RValue = 10;
Move semantics (move 생성자, move 대입 연산자)
"move 생성자, move 대입 연산자" 는 암묵적으로 생성되지 않으며 "복사 생성자, 대입 연산자"보다 우선순위 낮음.
std::move()
좌측값을 우측값으로 캐스팅.
주의 : vec2 = std::move(vec1); 의 경우, 이후 vec1 를 사용할 수 있을지는 보장 못함.
std::forward()
좌측값은 좌측값으로, 우측값은 우측값으로 캐스팅
lambda (람다)
문법
샘플 - Lamda 컨테이너 저장
샘플 - Lamda 리턴 함수
샘플 - Lamda 재귀 호출
decltype
타입을 식을 통해 정의한다.
auto의 확장판.
컴파일시 타입 결정.
nullptr
Null Pointer를 의미.
기존의 NULL이나 0이 int로 오인될 수 있는 여지를 없앰.
참고자료
http://download.microsoft.com/download/1/9/4/194B6F74-8A72-482D-AF0E-31CE9D855372/VisualC.PDF
류광의 번역이야기 - c++0x 글모음 : http://occamsrazr.net/tt/tag/C++0x
Visual Studio 2010 공식 팀 블로그 : http://vsts2010.net/category/C++0x
C++0x FAQ : http://www2.research.att.com/~bs/C++0xFAQ.html
auto
컴파일 타임에 Type 결정
class CTest{}; int _tmain() { auto str = "hi man"; // char* std::cout << str << std::endl; auto num = 10; // int std::cout << num << std::endl; auto* pNum = num // int* std::cout << *pNum << std::endl; auto& refNum = num; // int& std::cout << refNum << std::endl; auto* Test = new CTest(); // CTest* std::vector<int> vec; for( int i=0; i<10; i++ ) { vec.push_back(i); } for( auto it=vec.begin(); it!=vec.end(); ++it ) { std::cout << (*it) << std::endl; } return 0; }
static_assert
컴파일 타임의 assert
template< typename T, int size > class CTest { static_assert( size > 10, "[ERROR] size is 10"); static_assert( sizeof(size) == 8, "[ERROR] size is 8"); public: CTest() : Size(size) { } private: T Size; }; #define MAX_TEST 10 int _tmain() { static_assert(MAX_TEST == 0, "[ERROR] MAX_TEST is 10"); CTest<int, 10=""> Test; return 0; }
RValue Reference (우측 값 참조)
좌측 값 : 식이 끝난 후 계속 존재하는 값. Ex) int& LValue = var;
우측 값 : 식이 끝난 후 존재하지 않는 임시 값. Ex) int&& RValue = 10;
Move semantics (move 생성자, move 대입 연산자)
"move 생성자, move 대입 연산자" 는 암묵적으로 생성되지 않으며 "복사 생성자, 대입 연산자"보다 우선순위 낮음.
std::move()
좌측값을 우측값으로 캐스팅.
주의 : vec2 = std::move(vec1); 의 경우, 이후 vec1 를 사용할 수 있을지는 보장 못함.
std::forward()
좌측값은 좌측값으로, 우측값은 우측값으로 캐스팅
#include <iostream> using namespace std; class CTest { public: CTest() { cout << "CTest()" << endl; } CTest(int code, string str) { cout << "CTest(int code)" << endl; } CTest(CTest& cls) { cout << "CTest(CTest& cls)" << endl; } CTest& operator=(const CTest& cls) { cout << "CTest& operator=(const CTest& cls)" << endl; return *this; } // move CTest(CTest&& cls) { cout << "CTest(CTest&& cls)" << endl; } CTest& operator=(const CTest&& cls) { cout << "CTest& operator=(const CTest&& cls)" << endl; return *this; } }; int _tmain(int argc, _TCHAR* argv[]) { cout << endl << "1" << endl; CTest t1( CTest(10, "str") ); // 1. 인자 있는 생성자 호출 // 2. string이 우측값을 사용하므로 move 생성자가 호출 cout << endl << "2" << endl; CTest t2(10, "str"); // 1. 인자 있는 생성자 호출 cout << endl << "3" << endl; CTest t3 = t2; // 1. 복사 생성자 호출 cout << endl << "4,5" << endl; CTest t4, t5; // 1. t4, t5 생성자 호출 t5 = t4; // 2. 대입 생성자 호출 cout << endl << "6" << endl; CTest t6 = CTest(10, "str"); // 1. 인자 있는 생성자 호출 // 2. move 생성자 호출 cout << endl << "7,8" << endl; CTest t7, t8; // 1. t7, t8 생성자 호출 t8 = std::move(t7); // 2. move 대입 연산자 호출 return 0; }
lambda (람다)
문법
[] // lambda capture : 캡쳐할 변수 지정. [&]는 모든 외부 변수 참조로 사용. [=]는 모든 외부 변수 복사로 사용.
() // 함수의 인수 정의 -> // 리턴 타입 정의 {} // 함수의 본체 () // 함수 호출;
int n1,n2,n3,n4,n5;
[&n, n1, n2]{}; // 참조:n3,n4,n5, 복사:n1,n2
[=, &n1, &n2]{}; // 복사:n3,n4,n5, 참조:n1,n2
[n1,n1]{}; // Error:같은 변수 사용
[&, &n1]{}; // Error:n1은 이미 default참조로 지정
[=, n1]{}; // Error:n1은 이미 default복사로 지정
샘플 - Lamda 함수 호출
샘플 - Lamda 함수 호출
#include <iostream> using namespace std; template< typename Func > void Test( Func func ) { int ret = func(3); cout << "ret = " << ret << endl; } int _tmain(int argc, _TCHAR* argv[]) { int base = 7; auto func = [&](int n) -> int{ cout << "Hi Lamda : " << n << endl; return n+base; } ; Test( func ); return 0; }
샘플 - Lamda 컨테이너 저장
#include <iostream> #include <algorithm> #include <functional> #include <vector> using namespace std; int main() { vector<function<int()>> v; v.push_back( [] { return 100; } ); v.push_back( [] { return 200; } ); cout << v[0]() << endl; cout << v[1]() << endl; }
샘플 - Lamda 리턴 함수
#include <iostream> #include <functional> #include <string> std::function< void() > f() { std::string str("lambda"); return [=] { std::cout << "Hello, " << str << std::endl; }; } int main() { auto func = f(); func(); f()(); return 0; }
샘플 - Lamda 재귀 호출
int main() { function<int(int)> fact = [&fact](int x) { return x == 0 ? 1 : x * fact(x - 1); }; cout << fact(3) << endl; }
decltype
타입을 식을 통해 정의한다.
auto의 확장판.
컴파일시 타입 결정.
int i; decltype(i) i1 = 5; // int i1 = 5; decltype(i + i1) i2; // int i2; decltype(i*) i3 = &i; // int* i3 = &i; int foo(); decltype(foo()) value; // int value; std::vectorvec; // std::vector vec;
nullptr
Null Pointer를 의미.
기존의 NULL이나 0이 int로 오인될 수 있는 여지를 없앰.
char* ch = nullptr; // OK sizeof( nullptr ); // OK (4 byte) typeid( nullptr ); // OK throw nullptr; // OK int n = nullptr; // Error (nullptr는 클래스) Int n2 = 0 if( n2 == nullptr ); // Error if( nullptr ); // Error if( nullptr == 0 ); // Error nullptr = 0; // Error nullptr + 2; // Error
'C++' 카테고리의 다른 글
Dependency 관련 (0) | 2011.06.10 |
---|---|
ActiveX 제작시 고려 사항 - vista, win7, 64 bit (0) | 2011.06.09 |
RapidXml (0) | 2011.06.05 |
MFC UI 꾸미기 (0) | 2011.06.01 |
Regular Expression (정규 표현식) (0) | 2011.05.22 |
_MSC_VER 를 이용한 Visual Studio 버전별 코드 작성 (0) | 2011.05.09 |
WinINet 과 WinHTTP 샘플 (0) | 2011.05.03 |
파일/폴더 삭제 SHFileOperation와 IFileOperation (0) | 2011.04.10 |