본문 바로가기
  • 쓸쓸한 개발자의 공부방
C++

[C++] 변수 선언 : constexpr, structure binding

by 심찬 2021. 8. 7.

 

constexpr

컴파일 시간에 상수 값이 결정된다.  (c++11 부터 도입)

 

const 와 constexpr은 변수 값이 한 번 set되면 값을 변경을 허용하지 않는다.

constexpr은 컴파일 시간에만 상수를 만들 수 있다. c++에서는 constexpr를 쓰도록 추천한다.

int main()
{
    const int c1 = 10;
    c1 = 20;   // error

    constexpr int c2 = 10;
    c2 = 20;   // error
    
}

 

const는 10을 바로 set해주면서 값을 지정할 수 있고, 실행시간에 알 수 있도록 n 을 우변에 넣어 줄 수도 있다.

 

하지만 이는 정확하지 않고 문제가 발생할 소지가 있어 c++에서 constexpr을 새롭게 소개한다.

void foo( const int s)
{
    int arr[s];
}

int main()
{
    int arr1[10];             // ok
    
    int s1 = 10;
    //int arr2[s1];          // g++ : ok.   cl : error
    
    const int s2 = 10;       //컴파일에 값을 알 수 있는 상수
    int arr3[s2];            // ok 
    
//    const int s3 = s1;     // s1은 변수로 컴파일 할 때 크기를 알 수가 없다.
//    int arr4[s3];          //  cl 컴파일에서는 error 발생함.
}

 

 

const와 달리 constexpr은 우변에 n을 두었을 때 error가 발생한다.

constexpr double pi = 3.14;  // 좋은 예!

int main()
{
    int n = 10;
    
    const int c1 = 10; // 컴파일 시간 상수. 배열 크기
    const int c2 = n;  // 실행시간 상수. 배열 크기 안됨..
    
    constexpr int c3 = 10; // ok
    constexpr int c4 = n; // error
    
}

 

 


structured binding

 

구조체 값을 가져오는 아주 세련된 방식이다. auto 와 함께 사용해 간단하게 값을 읽어온다. (C++17부터 지원)

 

Point pt;

auto [x, y] = pt 

 

#include <iostream>

struct Point
{
    int x{10};
    int y{20};
};

int main()
{
    Point pt;
    
    // 평범한 구조체의 값 가져오는 방식
    int aa = pt.x;
    int bb = pt.y;
    
    std::cout << "0: "<< aa << ", " << bb << std::endl;
    
    // c++ 17 부터 지원하는 방법
    auto [x, y] = pt;
    
    std::cout << "1: "<< x << ", " << y << std::endl;
        
    int arr[2] = {1,2};
    auto [a,b] = arr;

    std::cout << "2: "<<x << ", " << y << std::endl;

    //int [x, y] = pt; // error
    
    const auto [x, y] = pt; // ok
    //const auto [x, y] = pt; // ok
    
    //int x = 10; // error
    
    std::cout << x << ", " << y << std::endl;
}

 

 

값의 형태를 미리 알고 있어서 int 형으로 선언해 사용하려 하면 아래와 같은 에러가 발생한다.

반드시 auto와 함께 사용이 가능하다.

#include <iostream>

struct Point
{
    int x{10};
    int y{20};
};

int main()
{
    Point pt;

    int [x, y] = pt; // error

    std::cout << x << ", " << y << std::endl;
}

 

const 및 참조 문법 사용 가능하다.

#include <iostream>

struct Point
{
    int x{10};
    int y{20};
};

int main()
{
    Point pt;

    //const 사용 가능
    const auto [x, y] = pt; // ok
    
    //참조 문법 사용 가능
    const auto& [a, b] = pt; // ok
    
    
    std::cout << x << ", " << y << std::endl;
    std::cout << a << ", " << b << std::endl;
}

 

댓글