INDIES
Lambda Expression람다는 함수 객체를 만드는데 굉장히 유용한 방법이다. 람다에 관련된 용어들은 서로 헷갈리는 경우가 많으니 간단히 한 번 짚고 넘어가자.람다 표현식(lambda expression)은 단순한 표현식이다. 이는 소스코드의 일부이다.std::find_if(container.begin(), container.end(), [](int val){ return 0 < val && val < 10; }); 이 코드에서 [](...){ ~ } 부분이 람다 표현식이다.클로져(closure)는 람다에 의해 런타임에 생성되는 객체이다. 캡쳐 모드에 따라 클로져는 캡쳐된 데이터의 복사본 또는 레퍼런스를 갖고 있게 된다. 위 코드의 std::find_if의 호출에서 런타임에 세 번째 인자(람다 표현..
perfect forwarding 실패 상황에 익숙해져라prefect forwarding을 쓰면 하나의 함수에서 다른 함수로 인자들을 완벽하게, 즉 인자 그 자체 뿐만 아니라 인자들의 미묘한 특성들(lvalue니 rvalue니, cv지정자니 하는 것들)까지 전달해준다.//원소 하나 전달 template void fwd(T&& param) { f(std::forward(param)); } //임의 개수 원소 전달 template void fwd(Ts&&... params) { f(std::forward(params)...); }그러나, 문제는 perfect forwarding이 불가능한 상황이 있다는 것이다. 그냥 f함수를 호출할 때는 잘 되는데 fwd 함수를 거쳐서 호출하는 건 불가능한 경우가 존재하기 ..
move가 별로 좋지 않다고 가정해라C++11에서 추가된 move semantics는 그 설명만 들으면 굉장히 좋아보인다. move semantics를 이용하면 컨테이너 이동을 포인터 복사하는데 걸리는 시간만에 처리하고, 임시 객체의 복사를 굉장히 빠르게 수행할 수 있다. 하지만, 실제로는 이런 표현들은 굉장히 과장된 것이다. move 연산은 존재하지도, 비용이 싸지도, 사용되지도 않는다고 가정하라.일단 move semantics를 지원하지 않는 타입에 대해서 먼저 살펴보자. 우선 C++ 98 시절에 작성한 타입들의 경우, C++11 기반의 컴파일러로 바꾸고 move를 쓰고 한다 해도 별로 성능 상의 이득을 못 볼 가능성이 있다. item 17에서 말했듯이 default move 생성자, 이동 대입 연산..