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;
}
'C++' 카테고리의 다른 글
[C++] 함수 : default parameter, function overloading (0) | 2021.08.08 |
---|---|
[C++] string : 비교, 대입, c_str() (0) | 2021.08.07 |
[C++] 변수 선언 : uniform initialize, auto, decltype, using (0) | 2021.08.06 |
[C++] cout, cin, iomanipulator (0) | 2021.08.05 |
[C++] header : iostream, cstdio, cstdlib, (0) | 2021.08.04 |
댓글