C++ 표준 라이브러리(Standard Library)가 지난 15년간 잘못 설계된 기능들을 공식적으로 폐기하거나 새로운 대체 기능 옆에 사실상 방치해왔다는 비판적인 분석이 제기되었습니다. 이로 인해 C++ 개발자들은 어떤 기능을 사용하고 피해야 할지 스스로 판단해야 하는 복잡한 상황에 놓여 있으며, 이는 언어의 생산성과 효율성을 저해하는 요인으로 작용하고 있습니다.
문제는 크게 두 가지 계층으로 나뉩니다. 첫째는 `std::auto_ptr`, 동적 예외 명세, C++11 가비지 컬렉션 인터페이스처럼 공식적으로 폐기되거나 제거된 항목들입니다. 둘째는 `std::regex`, `std::async`, `<iostream>`, `std::list`, `std::deque`, `std::vector<bool>`처럼 표준에는 남아있지만 실제 프로덕션 코드에서는 성능 문제나 설계 결함으로 인해 사용을 회피하는 기능들입니다. 특히 `std::function`은 C++11에 도입되었음에도 불구하고 `std::move_only_function`, `std::copyable_function` 등 새로운 대안들이 등장하며 사실상 ‘레거시’로 분류되고 있습니다. 기본 컨테이너인 `std::unordered_map`, `std::map`, `std::list`의 성능 문제는 심각하여, 동일한 워크로드 벤치마크에서 C++의 순진한(naive) 구현이 Rust 구현 대비 58배 느린 P99 사이클을 기록하기도 했습니다.
이러한 문제의 근본 원인으로는 C++의 엄격한 ABI(Application Binary Interface) 안정성 유지가 꼽힙니다. 파이썬(Python)이나 자바(Java), 러스트(Rust) 같은 다른 언어들이 잘못된 기능을 과감히 삭제하거나 에디션 전환을 통해 개선하는 것과 달리, C++은 ABI 호환성을 유지하기 위해 잘못된 기본값을 `std::` 네임스페이스 안에 사실상 영구적으로 보존하는 방식을 택했습니다. 이로 인해 현대 C++ 개발은 표준 라이브러리의 복잡한 역사와 수많은 우회책, 그리고 세 가지 주요 구현체(libstdc++, libc++, MSVC STL) 간의 미묘한 차이를 모두 이해해야 하는 소수의 전문가 영역이 되어가고 있습니다.
이러한 상황은 C++ 생태계 전반에 걸쳐 비효율성을 초래하며, 개발자들이 최신 기능을 활용하기보다는 과거의 함정을 피하는 데 더 많은 노력을 기울이게 만듭니다. 결국, C++ 표준 위원회는 1628년 침몰한 스웨덴 전함 바사(Vasa)의 비유처럼, 개별 기능의 추가가 전체 시스템에 미치는 영향을 충분히 고려하지 못하고 있다는 비판에 직면해 있습니다. 이는 C++의 미래 발전 방향과 언어의 실용성에 대한 중요한 질문을 던지고 있습니다.