C++(15)
-
Literal Class Type as Non-type Template Parameter
C++20 이전에는 템플릿 파라미터로 사용할 수 있는 non-type으로는 다음과 같은 것들이 있었다. lvalue reference type (to object or to function); an integral type; a pointer type (to object or to function); a pointer to member type (to member object or to member function); an enumeration type; std::nullptr_t; C++20 이후부터는 실수형 타입 및 클래스 타입도 템플릿 파라미터로 사용할 수 있게 되었다. a floating-point type; a literal class type with the following propertie..
2022.04.02 -
Template Template Parameter
템플릿 템플릿 파라미터(Template Template Parameter)란, 템플릿 인자로 class template 또는 alias template을 전달할 수 있게하는 langauage feature이다. 템플릿 인자로 class template/alias template을 전달해서 어디에 쓰이는지 알아보기 위해 다음 코드를 보자. template class Stack { private: Container m_Container; public: // You can use forwarding reference for the better performance void Push(T const& value); // Some member functions // ... }; int main() { // the ..
2022.03.25 -
.template / ::template / ->template
struct A { template void Foo(); }; template void Call(T arg) { arg.Foo(); // ERROR! } 위 코드에서 arg.Foo() 함수 콜은 다음과 같은 컴파일 에러가 발생한다. (clang, gcc에서는 컴파일 에러가 발생하며, msvc에서는 정상적으로 컴파일 된다.) error: use 'template' keyword to treat 'Foo' as a dependent template name 이 문제는 템플릿 파라미터에 의존하는 오브젝트의 템플릿 멤버함수를 호출하려고 할 때 발생하는 문제로, 컴파일러가 template도 같은 방식으로 사용할 수 있다. [참고] - C++ Templates: The Complete Guide, 2nd Edition
2022.03.23 -
클래스 템플릿에 선언된 friend 함수를 외부에 정의하는 방법
template class Stack { ... public: friend std::ostream& operator
2022.03.21 -
The Complete Guide to return x; - Implicit Move
이 포스트는 [The Complete Guide to return x]를 기반으로 재구성 되었습니다. ㅡ 이전 포스트에서 return x; 명령어가 실행될 때 발생하는 컴파일러 최적화인 Copy Elision 및 NRVO에 대해 알아보았다. 이 포스트에서는 C++의 버전이 올라감에 따라 NRVO에 생긴 문제를 알아보고, 이 문제를 해결하기 위해 변경된 표준에 대해 알아볼 것이다. C++11 C++11에 Move Semantics이 도입된 후로 NRVO에 문제가 생겼다. 다음 코드를 보자. unique_ptr f() { unique_ptr x = ~~~; return x; } f 함수는 로컬 변수 x의 할당을 제어할 수 있고, return expression은 변수 x의 이름인 id-expression 이..
2022.03.13 -
The Complete Guide to return x; - Copy Elision & NRVO
이 포스트는 [The Complete Guide to return x]를 기반으로 재구성 되었습니다. ㅡ 이 포스트에서는 return x; 명령어가 실행될 때 발생할 수 있는 컴파일러 최적화인 Copy Elision 및 NRVO에 대해 알아 볼 것이다. int f() { int i = 42; return i; } void test() { int j = f(); } 위 코드를 보면 test 함수에서 f 함수를 호출하여 반환 값을 통해 int j 변수를 초기화 하고 있다. x86-64 호출규약(calling convention)에서는 함수 f에서 return i; 명령어가 실행되면 함수 f의 스택 프레임에 있는 변수 i의 값을 함수 test의 스택 프레임에 있는 변수 j로 전달하기 위해 eax 레지스터에 변..
2022.03.12