태그: C++11
41편
-
C++ shared_future | 여러 스레드에서 future 결과 공유
std::future는 get()을 한 번만 부를 수 있어 여러 스레드가 같은 결과를 기다리면 문제가 됩니다. share()로 shared_future를 만들어 설정값이나 지연 계산 결과를 여러 워커가 공유하는 방법과, 예외 전파·스레드 안전성의 범위를 예제로 설명합니다.
-
C++ 범위 기반 for문 no begin function 에러: 내부 변환과 커스텀 컨테이너 begin·end
for (auto x : c)에서 no begin function 에러가 나는 이유를 범위 기반 for문의 내부 변환으로 설명하고, 커스텀 컨테이너에 begin()·end()를 붙이는 법과 값 복사, 반복 중 수정, 임시 객체 순회 같은 실수 8가지를 고칩니다.
-
C++ auto 타입 추론 실수: 참조·const가 떨어지는 복사, vector<bool> 프록시, 중괄호 추론
auto가 참조와 최상위 const를 떼어 내 의도치 않은 복사가 생기는 문제부터 초기화 누락, vector<bool> 프록시, 중괄호 초기화 추론까지 auto 관련 에러 8가지를 짚고, auto&·const auto&·auto&&를 고르는 기준을 정리합니다.
-
C++ emplace_back vs push_back: 실제 성능 차이와 언제 다른지
emplace_back은 인자를 받아 컨테이너 안에서 바로 객체를 생성하고, push_back은 이미 만든 객체를 복사하거나 이동합니다. 단순 타입과 복잡한 객체 벤치마크로 실제 차이가 언제 생기는지 확인하고, map·set에서의 emplace 사용도 다룹니다.
-
C++ weak_ptr: shared_ptr 순환 참조 끊기와 lock()·expired() 올바른 사용법
shared_ptr끼리 서로를 가리키면 참조 카운트가 0이 되지 않아 메모리가 새는 문제를 weak_ptr로 끊는 방법을 설명합니다. lock()과 expired()의 올바른 사용 순서, 캐시·옵저버·부모-자식 관계 예제, 만료된 항목 정리 패턴을 다룹니다.
-
C++ = default와 = delete: 특수 멤버 함수 제어와 복사 금지·이동 전용 타입
C++11 = default와 = delete로 특수 멤버 함수를 명시적으로 제어하는 방법을 설명합니다. 복사는 막고 이동만 허용하는 리소스 래퍼, 힙 할당 금지, 특정 타입 변환 차단, 싱글톤 예제와 Rule of Zero를 다룹니다.
-
C++ 전달 참조(유니버설 레퍼런스): T&&가 lvalue도 받는 조건과 std::forward
템플릿의 T&&가 rvalue 참조가 아니라 lvalue와 rvalue를 모두 받는 포워딩 참조가 되는 조건을 설명합니다. 넘긴 인자에 따라 T가 int&와 int로 달리 추론되는 과정, std::forward로 완벽 전달하는 팩토리·emplace 예제, forward 누락 실수를 다룹니다.
-
C++ 사용자 정의 리터럴: 리터럴 연산자 문법, cooked·raw 오버로드, 접미사 규칙
C++11 사용자 정의 리터럴(operator"") 문법과 언더스코어 접두사 규칙, cooked·raw 오버로드 선택 기준, chrono 리터럴 합성 원리, 접미사 충돌 함정을 실전 코드로 정리합니다.
-
C++ typedef vs using: 템플릿 별칭과 함수 포인터 별칭, 별칭은 새 타입이 아니다
중첩된 map<string, vector<pair<...>>> 같은 긴 타입에 이름을 붙일 때 typedef와 C++11 using이 어떻게 다른지 비교합니다. using만 가능한 템플릿 별칭, 읽기 쉬운 함수 포인터 별칭, 별칭이 새 타입을 만들지 않는다는 점에서 생기는 실수를 다룹니다.
-
C++11 중괄호 초기화: narrowing 방지, Most Vexing Parse, vector<int>{10}과 (10)의 차이
C++11 중괄호 초기화가 기본 타입, 배열, 구조체, 컨테이너를 같은 문법으로 초기화하면서 narrowing 변환을 컴파일 에러로 막고 Most Vexing Parse를 피하는 방식을 설명합니다. vector<int>{10}과 (10)이 다른 이유, auto와 함께 쓸 때의 함정도 다룹니다.
-
C++ thread_local: 스레드별 카운터·버퍼, 초기화 시점과 소멸 순서
thread_local 변수는 이름은 하나지만 스레드마다 별도 메모리에 존재해 락 없이 스레드별 카운터·버퍼·난수 생성기를 만들 수 있습니다. 스레드 시작 시와 첫 사용 시 초기화 차이, 클래스 멤버 선언 방법, 소멸 순서와 메모리 사용량 함정을 다룹니다.
-
C++ time_point: 시계별 시점, 해상도 변환(floor·round), 파일 시간 변환
time_point가 시계와 duration으로 구성되는 구조를 풀고, system_clock과 steady_clock 중 무엇을 기준으로 삼을지 설명합니다. duration_cast와 floor·round로 해상도를 낮출 때의 차이, 파일 시간 변환, 타임스탬프 직렬화도 다룹니다.
-
C++ std::tuple: 여러 값 반환, std::tie와 구조적 바인딩, 구조체와 비교
std::tuple로 여러 값을 한 번에 반환하고 std::get, 구조적 바인딩, std::tie로 꺼내는 방법을 비교합니다. tie를 이용한 사전식 비교와 정렬, tuple_cat과 std::apply 활용, pair 대신 tuple을 쓸지 구조체를 쓸지 판단하는 기준도 다룹니다.
-
C++ steady_clock으로 경과 시간 재기: system_clock·high_resolution_clock과 차이
C++ std::chrono::steady_clock으로 경과 시간을 재는 방법. 벤치마크, 타이머 클래스, 타임아웃 예제와 system_clock·high_resolution_clock과의 차이, 시계 선택·정밀도 문제를 정리합니다.
-
C++ static_assert: 타입 크기·템플릿 제약·구조체 레이아웃을 컴파일 시점에 검증하기
static_assert로 타입 크기, 템플릿 인자 제약, 플랫폼 조건, 구조체 레이아웃을 컴파일 시점에 검증하는 방법을 다룹니다. NDEBUG에 영향받는 assert와의 차이, 런타임 값을 넣었을 때의 에러, 템플릿에서 검사가 언제 일어나는지도 설명합니다.
-
noexcept로 C++ 이동 연산 최적화하기: 예외 계약 설계 패턴
커스텀 타입을 넣은 vector의 resize가 느린 이유가 이동 생성자에 noexcept가 없어 복사를 고르기 때문이라는 데서 출발합니다. noexcept 지정자와 연산자, move_if_noexcept, 조건부 noexcept, 예외 안전성 보장 수준과 terminate 문제를 다룹니다.
-
C++11 random 라이브러리: rand() % n이 편향되는 이유와 mt19937·분포 사용법
rand() % n이 편향되는 이유와 mt19937 엔진에 분포를 조합하는 C++11 random 사용법을 주사위, 셔플, 가중치 랜덤 예제로 보여주고, 호출마다 엔진을 새로 만드는 실수, random_device의 함정, 플랫폼별 분포 결과 차이를 설명합니다.
-
C++ std::ratio: 컴파일 타임 분수 연산과 chrono 단위 표현 원리
std::ratio로 분수를 타입에 담아 ratio_add, ratio_multiply 같은 연산과 약분을 컴파일 타임에 끝내는 방법, chrono::duration이 milli와 micro로 단위를 표현하는 원리를 보여주고, 단위 변환과 프레임 레이트 예제, 연산 중 오버플로우 문제를 다룹니다.
-
C++ sregex_iterator·sregex_token_iterator: 모든 매치 순회와 문자열 분할
문자열 안의 모든 정규식 매치를 sregex_iterator로 순회하며 캡처 그룹을 꺼내고, sregex_token_iterator로 구분자 기준 분할을 하는 방법을 단어 추출, URL 파싱, 로그 파싱 예제로 보여줍니다. 임시 문자열 수명, 빈 매치, 성능 함정도 다룹니다.
-
C++ Rule of Five 직접 구현하기: copy-and-swap, 자기 대입, noexcept 이동 연산
동적 배열, 파일 핸들, 문자열 클래스를 직접 만들며 소멸자, 복사·이동 생성자, 복사·이동 대입 연산자를 언제 함께 정의해야 하는지 보여줍니다. 자기 대입과 예외 안전성을 copy-and-swap으로 해결하는 법, 이동 연산의 noexcept 누락 문제도 다룹니다.
-
C++ std::random_device: 운영체제 엔트로피, mt19937 시드와 seed_seq, 플랫폼 차이
C++11 std::random_device의 하드웨어 기반 난수 생성 원리와 entropy() 확인법, mt19937 시드 생성·seed_seq 품질 개선, 암호 키·UUID·토큰 생성 실전 예제를 정리합니다.
-
C++ override와 final: 시그니처 실수를 컴파일 에러로 잡기와 devirtualization
override를 붙이면 오타나 const 누락으로 시그니처가 어긋나 새 가상 함수가 생기는 실수를 컴파일 에러로 잡을 수 있습니다. final로 클래스 상속이나 함수 재정의를 막는 기준과 final이 devirtualization으로 이어지는 조건을 예제로 설명합니다.
-
C++ std::packaged_task: 작업 큐와 스레드 풀에서 future로 결과·예외 받기
std::packaged_task로 함수를 감싸 두고 원하는 스레드와 시점에 실행한 뒤 future로 결과와 예외를 받는 방법을 작업 큐와 간단한 스레드 풀로 구현합니다. 실행 누락으로 get()이 영원히 기다리는 문제, 이동 전용이라 생기는 제약도 짚습니다.
-
C++ mutex와 lock_guard·unique_lock·scoped_lock: 임계 영역 보호와 데드락 방지
std::mutex 기본 사용법부터 lock_guard·unique_lock·scoped_lock RAII 패턴, 데드락 방지, recursive_mutex·timed_mutex까지 C++ 동기화 도구를 예제로 정리합니다.
-
C++ noexcept 지정자: 이동 생성자·swap·소멸자에 붙이는 이유와 위반 시 terminate
C++ noexcept 지정자로 함수가 예외를 던지지 않음을 명세하는 방법을 이동 생성자, swap, 소멸자, vector 최적화 예제로 정리합니다. 조건부 noexcept, noexcept 연산자, 위반 시 std::terminate 함정까지 다룹니다.
-
C++ nullptr vs NULL: NULL이 정수라서 생기는 오버로드·템플릿 버그
NULL이 사실상 정수 0이라서 int를 받는 오버로드와 섞이면 모호한 호출이나 의도와 다른 함수 선택이 생기고, 템플릿과 auto 추론에서는 포인터가 아닌 정수로 잡히는 문제를 보여줍니다. nullptr_t가 이를 막는 원리와 clang-tidy로 기존 코드를 옮기는 방법도 설명합니다.
-
C++ inline namespace로 API 버전 관리하기: 기본 버전 전환과 ABI 불일치 검출
inline namespace로 v1, v2 같은 API 버전을 나누면서 기본 버전을 바꿔도 사용자 코드는 그대로 두는 방법, 네임스페이스 이름이 링커 심볼에 들어가 ABI 불일치를 링크 단계에서 드러내는 원리, ADL과 특수화에서 주의할 점을 다룹니다.
-
C++ initializer_list 생성자: vector{10, 20}과 (10, 20)이 다른 이유와 중괄호 초기화 우선순위
중괄호 초기화에서 initializer_list 생성자가 다른 생성자보다 먼저 선택되는 규칙 때문에 vector<int>{10, 20}과 (10, 20)의 결과가 달라지는 이유를 설명하고, narrowing 오류, 요소가 항상 복사되는 문제, 빈 리스트 전달법을 예제로 확인합니다.
-
C++ explicit 키워드: 암시적 변환 막기, explicit operator bool, C++20 explicit(bool)
explicit를 붙이면 복사 초기화와 함수 인자에서 일어나던 암시적 변환이 막힙니다. 생성자와 변환 연산자, explicit operator bool, C++20 조건부 explicit(bool)의 동작을 비교하고, 스마트 포인터와 단위 타입에서 explicit를 쓰는 패턴을 정리합니다.
-
C++ random 확률 분포: uniform·normal·bernoulli·discrete와 엔진 분리 사용법
C++ <random>의 확률 분포(uniform, normal, bernoulli, binomial, discrete)를 엔진과 분리해 사용하는 방법을 실전 예제로 정리합니다. 경계값, 파라미터 검증, 재사용 성능 함정까지 다룹니다.
-
C++ chrono::duration: 단위 변환, duration_cast·round, 시간 리터럴과 정밀도 손실
std::chrono::duration의 타입 안전한 시간 표현과 상위/하위 단위 변환, duration_cast·round·ceil·floor, C++14 시간 리터럴, 실전 타이머 구현을 다룹니다.
-
C++ enum class: 밑바닥 타입, 비트 플래그, 문자열 변환 패턴
C++11 enum class의 스코프와 암시적 변환 차단, 밑바닥 타입과 ABI·직렬화, 문자열 변환 패턴, 비트 플래그 연산자 오버로딩, 범위 밖 정수 캐스팅과 Windows ERROR 매크로 충돌 같은 함정을 예제로 정리합니다.
-
C++ decltype: auto와 다른 타입 추론 규칙, decltype(auto), 괄호 하나로 바뀌는 결과
decltype이 표현식의 타입을 그대로 가져오는 규칙과 auto 추론의 차이, decltype(auto)와 후행 반환 타입, std::declval과 쉼표 연산자를 이용한 SFINAE, 괄호 하나로 결과가 참조로 바뀌는 함정을 예제로 설명합니다.
-
C++ constexpr 함수: 컴파일 타임 평가 조건과 C++11·14·17 제약 변화
constexpr 함수가 상수 표현식 문맥에서만 컴파일 타임에 평가되는 규칙을 설명하고, C++11의 단일 return 제약에서 C++14·C++17로 완화된 내용, constexpr 클래스, 정적 변수·가상 함수 사용 시 생기는 오류를 예제로 다룹니다.
-
C++ std::call_once와 once_flag: 스레드 안전한 1회 초기화와 예외 시 재시도
std::call_once와 once_flag로 여러 스레드가 동시에 호출해도 초기화 코드를 딱 한 번만 실행하는 방법을 싱글톤·설정 로드 예제로 보여 주고, 예외가 나면 다시 시도되는 동작과 인자·멤버 함수 전달법을 설명합니다.
-
C++ std::async와 launch 정책: future, deferred 실행, 흔한 함정
std::async에 launch::async와 launch::deferred를 지정했을 때 실행 시점이 어떻게 달라지는지 설명하고, 여러 future 결과 모으기, 예외 전달, wait_for로 상태 확인과 타임아웃 처리, 병렬 다운로드·맵 리듀스 예제를 다룹니다.
-
C++ 속성(Attributes): [[nodiscard]]·[[deprecated]]·[[likely]]·[[fallthrough]] 실전 사용법
[[nodiscard]]로 반환값 무시를 경고하고, [[deprecated]]로 API 교체를 알리며, [[maybe_unused]]·[[fallthrough]]·[[noreturn]]·C++20 [[likely]]를 어디에 붙여야 하는지 에러 처리와 API 마이그레이션 예제로 설명합니다.
-
C++ std::bind와 placeholders: 부분 적용, 멤버 함수 바인딩, 람다로 바꿀 때
std::bind로 함수 인자를 미리 고정하는 부분 적용, placeholders로 인자 순서를 바꾸는 방법, 멤버 함수 바인딩, 이벤트 핸들러와 콜백 시스템 예제를 설명하고, 같은 일을 람다로 옮겼을 때와 비교합니다.
-
모던 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++ 입문 개요 | 역사, 현대 C++의 변화, 실무에서 쓰이는 분야
C++의 역사(C with Classes부터 C++26까지)와 표준화 흐름, 게임·금융·임베디드·시스템 소프트웨어에서 왜 여전히 C++가 선택되는지, 그리고 학습 로드맵과 커리어 경로까지 다룹니다.