VisualC++ 과 C++0x

C++ 2011. 5. 30. 22:58
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 결정 
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 함수 호출
#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::vector vec;	// 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