Visual C++ 언어 규칙

이 항목에서는 Visual Studio 2017 및 이전 버전의 Visual C++용 컴파일러 기능 및 표준 라이브러리 기능에 대한 ISO C++03, C++11, C++14, C++17 및 초안 C++20 언어 표준 규칙을 요약하고 있습니다. 각 컴파일러 및 표준 라이브러리 기능 이름은 기능을 설명하는 ISO C++ 표준 제안 문서에 연결됩니다(게시 시점에 사용 가능한 경우). [지원됨] 열에는 기능에 대한 지원이 먼저 표시되는 Visual Studio 버전이 나열됩니다.

Visual Studio 2017의 규칙 향상 및 기타 변경 사항에 대한 자세한 내용은 Visual Studio 2017의 C++ 규칙 향상Visual Studio 2017의 Visual C++에 대한 새로운 기능 을 참조하세요. 이전 버전의 규칙 변경 내용에 대해서는 Visual C++ change history(Visual C++ 주요 변경 내용) 및 2003~ 2015 Visual C++ 주요 변경 내용을 참조하세요. C++ 팀의 최신 뉴스를 보려면 Visual C++ 팀 블로그를 방문하세요.

참고

Visual Studio 2015 ~ Visual Studio 2017에서 새로운 이진 변경 내용이 없습니다.

컴파일러 기능

기능 영역
C++03/11 핵심 언어 기능 지원됨
  그 밖의 모든 항목 VS 2015 A
  2단계 이름 조회 부분 B
  N2634 Expression SFINAE 부분 C
  N1653 C99 전처리기 부분 D
  N1988 확장된 정수 형식 해당 없음 E
C++14 핵심 언어 기능 지원됨
  N3323 컨텍스트 변환에 대해 조정된 표현 VS 2013
  N3472 이진 리터럴 VS 2015
  N3638 auto 및 decltype(auto) 반환 형식 VS 2015
  N3648 init 캡처 VS 2015
  N3649 제네릭 람다 VS 2015
  N3760 [[deprecated]] 특성 VS 2015
  N3778 크기가 지정된 할당 해제 VS 2015
  N3781 자릿수 구분 기호 VS 2015
  N3651 변수 템플릿 VS 2015.2
  N3652 확장된 constexpr VS 2017
  N3653 집계에 대한 NSDMI VS 2017
  N3664 할당 방지/융합 해당 없음 F
C++17 핵심 언어 기능 지원됨
  N4086 삼중자 제거 VS 2010 14
  N3922 중괄호로 묶인 Init 목록을 사용한 auto에 대한 새 규칙 VS 2015 14
  N4051 템플릿 template-parameters의 typename VS 2015 14
  N4266 네임스페이스 및 열거자에 대한 특성 VS 2015 14
  N4267 u8 문자 리터럴 VS 2015 14
  N4230 중첩된 네임스페이스 정의 VS 2015.3 17
  N3928 간결한 static_assert VS 2017 17
  P0184R0 일반화된 범위 기반 for 루프 VS 2017 14
  P0188R1 [[fallthrough]] 특성 VS 2017 17
  P0001R1 레지스터 키워드 제거 VS 2017 15.3 17
  P0002R1 bool 형식 operator++ 제거 VS 2017 15.3 17
  P0018R3 값으로 *this 캡처 VS 2017 15.3 17
  P0028R4 반복 없이 특성 네임스페이스 사용 VS 2017 15.3 17
  P0061R1 __has_include VS 2017 15.3 14
  P0138R2 정수에서 고정 열거형 Direct-list-init VS 2017 15.3 17
  P0170R1 constexpr 람다 VS 2017 15.3 17
  P0189R1 [[nodiscard]] 특성 VS 2017 15.3 17
  P0212R1 [[maybe_unused]] 특성 VS 2017 15.3 17
  P0217R3 구조적 바인딩 VS 2017 15.3 17
  P0292R2 constexpr if 문 VS 2017 15.3 G
  P0305R1 이니셜라이저를 사용하는 선택 문 VS 2017 15.3 17
  P0245R1 Hexfloat 리터럴 아니요
  N4261 한정 변환 수정 아니요
  N4268 더 많은 비형식 템플릿 인수 허용 아니요
  N4295 식 폴딩 아니요
  P0003R5 동적 예외 사양 제거 아니요
  P0012R1 형식 시스템에 noexcept 추가 아니요
  P0017R1 확장된 집계 초기화 아니요
  P0035R4 과다 정렬된 동적 메모리 할당 아니요
  P0036R0 일부 비어 있는 단항 폴드 제거 아니요
  P0091R3 클래스 템플릿에 대한 템플릿 인수 추론
  P0512R0 클래스 템플릿 인수 추론 문제(영문)
아니요
  P0127R2 자동으로 비형식 템플릿 매개 변수 선언 아니요
  P0135R1 보장된 복사 생략 아니요 H
  P0136R1 상속 생성자 다시 표시 아니요
  P0145R3 식 계산 순서 구체화
  P0400R0 함수 인수 평가 순서(영문)
아니요
  P0195R2 using 선언의 팩 확장 아니요
  P0283R2 인식할 수 없는 특성 무시 아니요
  P0386R2 인라인 변수 아니요
  P0522R0 template-parameters 템플릿을 호환되는 인수와 일치 아니요
  P0702R1 이니셜라이저 목록 작업자(initializer-list actors)에 대한 클래스 템플릿 인수 추론 문제 해결(영문) 아니요
C++20 핵심 언어 기능 지원됨
  P0306R4 쉼표 생략 및 쉼표 삭제에 __VA_OPT__ 추가(영문) 아니요
  P0329R4 지정된 초기화(영문) 아니요
  P0409R2 [=, this] 람다 캡처 허용(영문) 아니요
  P0428R2 일반 람다에 대한 친숙한 템플릿 구문(영문) 아니요
  P0683R1 비트 필드에 대한 기본 멤버 이니셜라이저(영문) 아니요
  P0704R1 멤버에 대한 const lvalue ref-qualified 포인터 수정(영문) 아니요
  P0734R0 개념(영문) 아니요

표준 라이브러리 기능

기능 영역
C++20 표준 라이브러리 기능 지원됨
  P0463R1 endian(영문) 아니요
  P0674R1 배열에 대한 make_shared()(영문) 아니요
C++17 표준 라이브러리 기능 지원됨
  P0433R2 클래스 템플릿에 대한 템플릿 추론을 표준 라이브러리에 통합(영문)
  P0739R0 표준 라이브러리에 클래스 템플릿 인수 추론 통합 향상(영문)
아니요
  P0607R0 표준 라이브러리에 대한 인라인 변수(영문) 아니요
  P0426R1 char_traits에 대한 constexpr 아니요
  P0030R1 hypot(x, y, z) 아니요
  P0033R1 enable_shared_from_this 다시 표시 아니요
  P0220R1 라이브러리 기본 사항 V1 부분 J
  P0414R2 shared_ptr<T[]>, shared_ptr<T[N]>
  P0497R0 배열에 대한 shared_ptr 해결
아니요
  P0083R3 맵 및 집합 스플라이스
  P0508R0 명확히 insert_return_type 설명
아니요
  P0005R4 not_fn()
  P0358R1 not_fn()에 대한 수정 사항
아니요
  P0067R5 기본 문자열 변환 아니요
  P0618R0 <codecvt> 사용 중단(영문) 아니요
  P0521R0 shared_ptr::unique() 사용 중단 아니요
  P0174R2 남아 있는 라이브러리 파트 사용 중단 아니요
  P0003R5 동적 예외 사양 제거 아니요
  P0302R1 std::function에서 할당자 지원 제거 아니요
  N4562 라이브러리 기본 사항: <memory_resource>
  P0337R0 polymorphic_allocator 할당 삭제
아니요
  P0024R2 병렬 알고리즘
  P0336R1 병렬 실행 정책 이름 바꾸기
  P0394R4 예외가 발생할 경우 병렬 알고리즘을 종료()해야 함
  P0452R1 <numeric> 병렬 알고리즘 통합(영문)
아니요
  P0226R1 수학 특수 함수 아니요
  P0218R1 <filesystem>
  P0219R1 파일 시스템에 대한 상대 경로
  P0317R1 파일 시스템에 대한 디렉터리 항목 캐싱(영문)
  P0392R0 파일 시스템 경로에서 string_view 지원
  P0430R2 비POSIX 파일 시스템 지원(영문)
  P0492R2 파일 시스템에 대한 NB 주석 해석(영문)
아니요 K
  N4562 라이브러리 기본 사항: Boyer-Moore search()
  P0253R1 검색자 반환 형식 수정
VS 2017 15.3 17
  P0031R0 <array>(다시 실행) 및 <iterator>에 대한 constexpr VS 2017 15.3 17
  P0040R3 메모리 관리 도구 확장 VS 2017 15.3 17
  P0084R2 Emplace 반환 형식 VS 2017 15.3 17
  P0152R1 atomic::is_always_lock_free VS 2017 15.3 17
  P0154R1 hardware_destructive_interference_size 등 VS 2017 15.3 17
  P0156R2 Variadic lock_guard를 scoped_lock으로 이름 바꾸기(영문) VS 2017 15.3 17
  P0258R2 has_unique_object_representations VS 2017 15.3 L
  P0295R0 gcd(), lcm() VS 2017 15.3 17
  P0298R3 std::byte(영문) VS 2017 15.3 17, byte
  P0403R1 <string_view>용 UDL("meow"sv 등) VS 2017 15.3 17
  P0418R2 atomic compare_exchange memory_order 요구 사항 VS 2017 15.3 14
  P0435R1 common_type 점검
  P0548R1 Tweaking common_type 및 기간 조정(영문)
VS 2017 15.3 14
  P0505R0 <chrono>(다시 실행)에 대한 constexpr VS 2017 15.3 17
  P0513R0 악성 공격 해시
  P0599R1 noexcept 해시(영문)
VS 2017 15.3 14
  P0516R0 shared_future 복사를 noexcept로 표시 VS 2017 15.3 14
  P0517R0 future_errc에서 future_error 생성 VS 2017 15.3 14
  P0558R1 원자성 이름 지정 기본 클래스 불일치 해결(영문) VS 2017 15.3 14
  P0604R0 is_callable/result_of를 invoke_result, is_invocable, is_nothrow_invocable로 변경(영문) VS 2017 15.3 17
  N4562 라이브러리 기본 사항: <algorithm> sample() VS 2017
  N4562 라이브러리 기본 사항: <any> VS 2017
  N4562 라이브러리 기본 사항: <optional> VS 2017
  N4562 라이브러리 기본 사항: <string_view> VS 2017
  N4562 라이브러리 기본 사항: <tuple> apply() VS 2017
  P0032R3 variant/any/optional에 대한 동종 인터페이스 VS 2017
  P0077R2 is_callable, is_nothrow_callable VS 2017
  P0088R3 <variant> VS 2017
  P0163R0 shared_ptr::weak_type VS 2017
  P0209R2 make_from_tuple() VS 2017
  P0254R2 string_view 및 std::string 통합 VS 2017
  P0307R2 선택적으로 크거나 같게 만들기 VS 2017
  P0393R3 Variant를 크거나 같게 만들기 VS 2017
  P0504R0 in_place_t/in_place_type_t<T>/in_place_index_t<I> 다시 방문 VS 2017
  P0510R0 없음, 배열, 참조, 불완전한 형식의 variant 거부 VS 2017
  P0025R1 clamp() VS 2015.3
  P0185R1 is_swappable, is_nothrow_swappable VS 2015.3
  P0272R1 상수가 아닌 basic_string::data() VS 2015.3
  N4387 쌍 및 튜플 향상 VS 2015.2 14
  N4508 shared_mutex(시간 제한 없음) VS 2015.2 14
  P0004R1 사용되지 않는 Iostreams 별칭 제거 VS 2015.2 rem
  P0006R0 형식 특성에 대한 변수 템플릿(is_same_v 등) VS 2015.2 14
  P0007R1 as_const() VS 2015.2 14
  P0013R1 논리 연산자 형식 특성(conjunction 등) VS 2015.2 14
  P0074R0 owner_less<> VS 2015.2 14
  P0092R1 <chrono> floor(), ceil(), round(), abs() VS 2015.2 14
  P0156R0 Variadic lock_guard VS 2015.2 14
  N3911 void_t VS 2015 14
  N4089 unique_ptr<T[]>에서 안전하게 변환 VS 2015 14
  N4169 invoke() VS 2015 14
  N4190 auto_ptr, random_shuffle() 및 이전 <functional> 항목 제거 VS 2015 rem
  N4258 noexcept 정리 VS 2015 14
  N4259 uncaught_exceptions VS 2015 14
  N4277 일반적으로 복사 가능한 reference_wrapper VS 2015 14
  N4279 map/unordered_map에 대한 insert_or_assign()/try_emplace() VS 2015 14
  N4280 size(), empty(), data() VS 2015 14
  N4366 정확하게 unique_ptr 할당 제약 VS 2015 14
  N4389 bool_constant VS 2015 14
  P0063R3 C11 표준 라이브러리 VS 2015 C11, 14
  N4510 vector/list/forward_list에서 불완전한 형식 지원 VS 2013 14
C++14 표준 라이브러리 기능 지원됨
  N3462 SFINAE-Friendly result_of VS 2015.2
  N3302 <complex>에 대한 constexpr VS 2015
  N3469 <chrono>에 대한 constexpr VS 2015
  N3470 <array>에 대한 constexpr VS 2015
  N3471 <initializer_list>, <tuple>, <utility>에 대한 constexpr VS 2015
  N3545 integral_constant::operator()() VS 2015
  N3642 <chrono>, <string>에 대한 UDL(1729ms, "meow" 등) VS 2015
  N3644 Null 정방향 반복기 VS 2015
  N3654 quoted() VS 2015
  N3657 유형이 다른 연관 조회 VS 2015
  N3658 integer_sequence VS 2015
  N3659 shared_mutex(시간 제한) VS 2015
  N3668 exchange() VS 2015
  N3669 const 없는 constexpr 멤버 함수 수정 VS 2015
  N3670 get<T>() VS 2015
  N3671 이중 범위 equal(), is_permutation(), mismatch() VS 2015
  N3778 크기가 지정된 할당 해제 VS 2015
  N3779 <complex>에 대한 UDL(3.14i 등) VS 2015
  N3789 <functional>에 대한 constexpr VS 2015
  N3887 tuple_element_t VS 2015
  N3891 shared_mutex(시간 제한)의 이름을 shared_timed_mutex로 바꾸기 VS 2015
  N3346 최소 컨테이너 요소 요구 사항 VS 2013
  N3421 투명 연산자 함수(less<> 등) VS 2013
  N3655 <type_traits>에 대한 별칭 템플릿(decay_t 등) VS 2013
  N3656 make_unique() VS 2013
  N3924 rand() 권장 안 함 N/A

함께 나열된 문서 그룹은 기능이 표준으로 선출되고 해당 기능을 개선하거나 확장하기 위한 문서도 하나 이상 선출되었음을 나타냅니다. 이러한 기능은 함께 구현됩니다.

지원되는 값

아니요__는 아직 구현되지 않은 것을 의미합니다.
__부분__은 Visual Studio 2017에서 부분적으로 구현되었음을 의미합니다. 자세한 내용은 참고 섹션을 참조하세요.
__해당 없음__은 제안 문서에서 해당 기능을 설명하지 않음을 의미합니다. 이러한 문서에서는 표준 언어를 변경했지만 구현자를 위한 작업을 만들지 않았습니다. 이 기능은 목록의 완전성을 위해 표시됩니다.
__VS 2010__은 Visual Studio 2010에서 지원되는 기능을 나타냅니다.
__VS 2013__은 Visual Studio 2013에서 지원되는 기능을 나타냅니다.
__VS 2015__은 Visual Studio 2015 RTM에서 지원되는 기능을 나타냅니다.
__VS 2015.2
및 __VS 2015.3__은 각각 Visual Studio 2015 업데이트 2와 Visual Studio 2015 업데이트 3에서 지원되는 기능을 나타냅니다.
__VS 2017__은 Visual Studio 2017 RTM에서 지원되는 기능을 나타냅니다.
__VS 2017 15.3__은 Visual Studio 2017 버전 15.3에서 지원되는 기능을 나타냅니다.

참고

A C++11에서 사용되지 않는 C++03의 동적 예외 사양을 무시합니다. 이러한 사양은 구현할 계획이 없으며 향후 C++ 표준에서 제거할 예정입니다.
B 2단계 이름 조회에 대한 컴파일러의 지원은 향상되었지만 여전히 불완전합니다.
C Expression SFINAE에 대한 컴파일러의 지원은 Visual Studio 2015 업데이트 2 이후로 표준 라이브러리에는 충분했지만 지원은 여전히 불완전합니다.
D Visual Studio 2017에서는 C99 전처리기 규칙에 대한 컴파일러의 지원이 불완전합니다. Variadic 매크로는 지원되지만 전처리기의 동작에 많은 버그가 있습니다.
E 컴파일러에서 확장된 정수 형식을 지원할 수는 있지만 필수는 아니므로 [적용할 수 없음]으로 표시됩니다. GCC 및 Clang와 마찬가지로 지원하지 않기로 선택했습니다.
F 마찬가지로 컴파일러에서 이 최적화를 구현할 수는 있지만 필수는 아니므로 [적용할 수 없음]으로 표시됩니다.
G /std:c++14 아래에서 억제 가능한 경고로 표시됩니다.
H 이 기능은 Visual Studio 2017 버전 15.3의 미리 보기에서 사용할 수 있었지만, 버그가 발견되어 릴리스에서 제거되었습니다.
J Visual Studio 2015에서 완전하지 않은 기능은 이 표의 다른 곳에 나와 있습니다.
K TS 파일 시스템은 기록을 위해 <experimental/filesystem> 및 <filesystem> 모두에서 구현되지만, 네임스페이스를 이동하기 전에 해당 구현을 수정해야 합니다. 이 작업이 완료될 때까지는 기능이 아직 구현되지 않은 것으로 표시됩니다.
L 컴파일러 내장 함수에서 지원됩니다. 이 내장 함수는 아직 Clang에서 사용할 수 없습니다. 이 기능은 사용할 수 있지만 Intellisense에는 아직 사용할 수 없습니다.
14 이러한 C++17 기능은 /std:c++14(기본값)를 지정한 경우에도 항상 활성화됩니다. 이는 /std 옵션을 도입하기 전에 기능이 구현되었거나 조건부 구현이 바람직하지 않게 복잡했기 때문입니다.
17 이러한 기능은 /std:c++17(또는 /std:c++latest) 컴파일러 옵션으로 활성화됩니다.
byte std::byte/std:c++17(또는 /std:c++latest)로 활성화되지만, 경우에 따라 Windows SDK 헤더와 충돌할 수 있으므로 세분화된 옵트아웃 매크로가 있습니다. _HAS_STD_BYTE0으로 정의하여 비활성화할 수 있습니다.
C11 유니버셜 CRT에서는 C99 strftime() E/O 대체 변환 지정자, C11 fopen() 단독 모드 및 C11 aligned_alloc()을 제외하고는 C++17에 필요한 C11 표준 라이브러리의 일부를 구현했습니다. 후자는 C11에서 free()의 Microsoft 구현과 호환되지 않는 방식으로 free()에서 고도로 정렬된 할당을 처리할 수 있어야 하는 aligned_alloc()을 지정했기 때문에 구현되지 않을 것입니다.
rem /std:c++17(또는 /std:c++latest) 컴파일러 옵션이 지정되면 기능이 제거됩니다. 이러한 기능에는 _HAS_AUTO_PTR_ETC, _HAS_FUNCTION_ALLOCATOR_SUPPORT, _HAS_OLD_IOSTREAMS_MEMBERS_HAS_UNEXPECTED 옵트아웃 매크로가 있습니다.

참고 항목

C++ 언어 참조
C++ 표준 라이브러리
Visual Studio 2017의 C++ 규칙 향상
Visual Studio 2017의 Visual C++에 대한 새로운 기능
2003~ 2015 Visual C++ 주요 변경 내용
Visual C++ 2003 ~ 2015의 새로운 기능
Visual C++ 팀 블로그