태그: C++17
29편
-
C++17 scoped_lock: 여러 뮤텍스를 데드락 없이 잠그기와 lock_guard·unique_lock 비교
계좌 이체처럼 두 뮤텍스를 잠가야 할 때 순서가 엇갈려 생기는 데드락을 std::scoped_lock 한 줄로 피하는 방법과, lock_guard, unique_lock과의 차이, C++11에서 std::lock으로 같은 효과를 내는 법, 계층적 잠금 패턴을 예제로 설명합니다.
-
C++ RVO와 NRVO: C++17 보장 복사 생략과 return std::move가 NRVO를 막는 경우
return 문에서 복사가 언제 생략되는지 RVO와 NRVO를 나눠 설명하고, C++17이 보장하는 복사 생략의 범위와 여러 반환 경로나 return std::move 때문에 NRVO가 깨지는 경우를 GCC로 직접 확인한 결과와 함께 보여줍니다.
-
C++ std::any vs void*: 타입 안전성·크기·성능 비교와 void*가 필요한 곳
임의의 타입을 저장해야 할 때 void*와 std::any 중 무엇을 쓸지 타입 안전성, 메모리 크기, 성능 기준으로 비교하고, 설정 저장소·이벤트 시스템·플러그인 예제와 C 라이브러리 인터페이스에서의 void* 사용법을 다룹니다.
-
C++ std::optional vs 포인터: 값이 없을 수 있는 반환값을 어떻게 표현할까
값이 없을 수 있는 반환값이나 선택적 매개변수를 nullptr 포인터 대신 std::optional로 표현하면 무엇이 안전해지는지 비교합니다. 반대로 다형성이나 큰 객체를 소유하지 않고 참조할 때는 왜 포인터가 맞는지 메모리 레이아웃과 벤치마크로 설명합니다.
-
C++ std::variant vs union: 타입 안전성과 비용 비교
C++ union이 활성 멤버를 추적하지 않아 생기는 문제와 std::variant가 이를 해결하는 방식을 비교하고, std::visit와 overloaded 패턴으로 타입별 처리를 작성하는 방법, JSON 값·AST 노드·에러 처리 예제를 다룹니다.
-
C++17 구조적 바인딩: map·pair·tuple 분해와 auto&·const auto& 선택
auto [key, value] 한 줄로 map 요소, pair, tuple, 구조체를 이름 있는 변수로 푸는 C++17 구조적 바인딩을 다룹니다. auto&·const auto& 선택, insert 결과를 if 초기화문과 함께 받는 패턴, 커스텀 타입에 튜플 프로토콜을 붙이는 방법을 예제로 봅니다.
-
C++ Fold Expressions 이해하기: 단항·이항부터 C++26 Pack Indexing까지
파라미터 팩 전체에 연산을 적용할 때 재귀 템플릿 대신 C++17 fold expression으로 펼치는 방법을 다룹니다. 단항·이항, 좌측·우측 fold의 전개 순서와 빈 팩 규칙, 쉼표 fold 활용, 커스텀 연산자 fold와 C++26 pack indexing까지 예제로 설명합니다.
-
string_view와 span: 복사 없이 넘기기, SSO와의 관계, mdspan, 댕글링 방지
C++ std::string_view와 std::span 정리. 복사 없이 문자열과 배열을 넘기는 방법, SSO와의 관계, mdspan, 댕글링 참조가 생기는 경우와 방지법, 성능 비교를 다룹니다.
-
Windows에서만 파일을 못 찾을 때: std::filesystem 경로 연산, 디렉터리 순회, 권한
Linux·macOS에선 되는데 Windows에서만 파일을 못 찾는 문제에서 출발해 std::filesystem을 정리합니다. 경로 연산, 디렉터리 순회, 파일 복사·이동·삭제, 권한, 자주 나는 에러를 다룹니다.
-
std::optional로 '값 없음' 표현하기: value_or, C++23 and_then·transform, 에러 처리 패턴
조회 실패나 파싱 실패처럼 값이 없을 수 있는 결과를 널 포인터나 -1 대신 std::optional로 표현하는 방법을 DB 조회, 설정 파싱, 캐시 예제로 보여주고, value_or와 C++23 and_then, transform, or_else로 검사 코드를 줄이는 법을 설명합니다.
-
C++17·20·23 주요 기능 정리: 구조화 바인딩부터 Concepts·Ranges·std::print까지
C++17의 구조화 바인딩, if constexpr, optional, variant, filesystem부터 C++20의 Concepts, Ranges, 코루틴, 모듈, <=> 연산자, C++23의 std::print와 다차원 첨자까지 각 기능이 기존 코드의 어떤 불편을 줄이는지 예제로 비교합니다.
-
C++ union과 std::variant: 공용체의 타입 안전성 문제와 variant로 바꾸기
C++ union의 메모리 겹침 구조와 그 타입 안전성 문제를 std::variant(C++17)가 어떻게 해결하는지 JSON 값, 상태 머신, Result 타입 예제로 정리합니다. get_if, holds_alternative, 태그 붙은 union 함정까지 다룹니다.
-
C++17 std::invoke와 std::apply: INVOKE 규칙과 튜플을 인자로 펼치는 원리
std::invoke가 자유 함수, 멤버 함수 포인터, 함수 객체를 한 문법으로 호출하는 INVOKE 규칙과 std::apply가 index_sequence로 튜플을 풀어 인자로 넘기는 원리를 설명하고, make_from_tuple과 invoke_result·is_invocable 검사를 예제로 다룹니다.
-
C++17 if constexpr: 컴파일 타임 분기로 템플릿 단순화하기와 static_assert(false) 문제
if constexpr는 선택되지 않은 분기를 인스턴스화하지 않아 타입별 처리를 템플릿 하나로 쓸 수 있게 해 줍니다. 재귀 종료와 SFINAE 대체 예제, else에 static_assert(false)를 넣으면 생기는 문제, 분기마다 반환 타입이 달라지는 함정을 짚습니다.
-
C++ std::filesystem 파일 연산: copy·rename·remove와 덮어쓰기·원자성 문제
std::filesystem의 copy, rename, remove, create_directories로 파일과 디렉토리를 다루면서 대상이 이미 있을 때의 덮어쓰기 에러, 비어 있지 않은 디렉토리 삭제 실패, 예외와 error_code 중 무엇을 쓸지 같은 문제를 예제로 해결합니다.
-
C++ filesystem::status로 파일 종류·권한·수정 시간 확인하기
std::filesystem::status와 symlink_status가 반환하는 file_status로 파일 종류와 권한을 확인하는 방법, perms 비트 검사, 수정 시간과 디스크 공간 조회, 심볼릭 링크와 존재 확인에서 생기는 함정을 예제로 다룹니다.
-
C++17 std::filesystem 빠른 참조: 경로 정규화, exists()의 TOCTOU, remove_all 주의점
C++17 std::filesystem의 path 정규화, exists()의 TOCTOU 위험, remove_all 오남용, 예외 vs error_code 선택 기준을 실전 경험과 함께 정리했습니다.
-
C++17 실행 정책 seq·par·par_unseq: 병렬 알고리즘과 데이터 레이스 함정
C++17 실행 정책으로 병렬 알고리즘을 구현하는 방법. seq, par, par_unseq 정책 비교, std::transform, std::sort 병렬화 실전 예제와 데이터 레이스·오버헤드 함정을 정리합니다.
-
C++17 directory_iterator로 폴더 순회하기: 재귀 탐색, 필터링, 심볼릭 링크와 오류 처리
C++17 filesystem의 directory_iterator와 recursive_directory_iterator로 폴더를 순회하며 확장자별 파일 검색, 디렉터리 크기 계산, 필터링을 구현하고, 심볼릭 링크 추적 옵션과 error_code 기반 오류 처리를 설명합니다.
-
C++17 constexpr 람다: 암시적 constexpr 조건과 컴파일 타임 룩업 테이블
C++17부터 람다가 조건을 만족하면 암시적으로 constexpr이 되는 규칙을 설명하고, 팩토리얼·거듭제곱·배열 초기화 같은 컴파일 타임 계산, 타입 검사와 조건부 컴파일, 룩업 테이블을 만드는 활용 패턴을 다룹니다.
-
C++ Copy Elision 심화 | RVO·NRVO·필수 생략·예외 안전
C++17에서 prvalue 반환에 복사 생략이 의무가 된 규칙과 NRVO처럼 여전히 컴파일러 재량인 경우를 구분하고, NRVO가 실패하는 조건, 이동 폴백과 noexcept, return std::move가 최적화를 막는 이유를 설명합니다.
-
[[nodiscard]]로 반환값 무시 막기: 에러 코드, RAII 타입, 사유 메시지, Clang-Tidy 검증
C++ [[nodiscard]] 정리. 반환값을 무시해서 생기는 버그, 에러 코드와 RAII 타입에 붙이는 법, C++20 사유 메시지와 생성자 적용, Clang-Tidy 검증, C++26 std::ignore 논의를 다룹니다.
-
C++17 CTAD: 클래스 템플릿 인자 추론 원리와 추론 가이드가 필요한 경우
C++17 CTAD가 클래스 템플릿 인자를 추론하는 원리, 반복자 생성자처럼 추론 가이드가 꼭 필요한 경우, 그리고 vector{v}·map 중첩 중괄호·explicit처럼 자주 틀리는 동작을 컴파일해 확인한 예제로 정리합니다.
-
C++17 std::any: any_cast 동작, variant·void*와의 차이, 성능 오버헤드
C++17 std::any로 서로 다른 타입의 값을 담는 방법과 any_cast의 값·포인터·참조 형태별 동작, variant·void*와 비교한 타입 안전성과 성능 오버헤드, 설정 저장소·이벤트 시스템·플러그인 예제를 다룹니다.
-
C++ filesystem::path: 경로 결합·분해, absolute·canonical·relative 차이
std::filesystem::path의 / 연산자로 경로를 결합하고 filename, stem, extension으로 부분을 추출하는 법, absolute, canonical, relative의 차이, 확장자 일괄 변경과 백업 경로 생성 예제로 Windows와 Linux에서 같은 코드가 동작하게 만드는 방법을 다룹니다.
-
모던 C++ (C++11~C++20) 핵심 문법 치트시트 | auto·람다
C++11부터 C++20까지 버전별로 자주 쓰는 문법을 모았습니다. auto와 람다, 스마트 포인터, 구조화된 바인딩과 optional·variant, if constexpr, Concepts·Ranges·코루틴·삼원 비교 연산자를 짧은 예제로 바로 찾아볼 수 있습니다.
-
C++ 범위 기반 for문과 구조화된 바인딩 | 모던 C++ 반복문
C++11 범위 기반 for와 C++17 구조화된 바인딩 사용법. auto·auto&·const auto&·auto&& 선택, map 순회, 임시 객체 수명(메서드 체인은 C++20까지 위험), vector<bool> 프록시, 커스텀 타입의 begin/end, 순회 중 수정 금지와 실전 패턴을 예제로 정리합니다.
-
C++17 optional·variant·any: nullptr 체크 대신 타입으로 표현하기
값이 없을 수 있는 결과는 nullptr 대신 std::optional로, 여러 타입 중 하나는 std::variant와 std::visit으로, 임의 타입은 std::any로 표현하는 방법을 비교합니다. 빈 optional 접근, 잘못된 get·any_cast 같은 흔한 실수도 짚습니다.
-
C++ 입문 개요 | 역사, 현대 C++의 변화, 실무에서 쓰이는 분야
C++의 역사(C with Classes부터 C++26까지)와 표준화 흐름, 게임·금융·임베디드·시스템 소프트웨어에서 왜 여전히 C++가 선택되는지, 그리고 학습 로드맵과 커리어 경로까지 다룹니다.