C++14
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
C++14는 2014년에 발표된 C++ 프로그래밍 언어의 표준으로, C++11의 기능을 개선하고 새로운 기능을 추가하여 개발 생산성을 향상시켰다. 주요 변경 사항으로는 함수 반환 형식 추론, 선언 시 대체 형식 추론(decltype(auto)), 완화된 constexpr 제약, 변수 템플릿, 애그리게이트 멤버 초기화, 바이너리 및 숫자 리터럴 구분자, 제네릭 람다, 람다 캡처 표현식, deprecated 속성 등이 있다. 또한 표준 라이브러리에 공유 시간 제한 뮤텍스, 이종 검색, 사용자 정의 리터럴, 튜플 어드레싱 등의 기능이 추가되었다. 주요 컴파일러들은 C++14 표준을 지원하며, Clang, GCC, Microsoft Visual Studio, Intel C++ Compiler 등에서 C++14 기능을 구현했다.
더 읽어볼만한 페이지
- 프로그래밍 언어 표준 - ISO/IEC JTC 1/SC 22
ISO/IEC JTC 1/SC 22는 프로그래밍 언어, 환경 및 시스템 소프트웨어 인터페이스 분야의 표준화를 담당하는 ISO/IEC JTC 1의 하위 위원회이며, 다양한 프로그래밍 언어와 시스템 소프트웨어 인터페이스의 표준화를 목표로 1985년에 설립되었다. - 프로그래밍 언어 표준 - C99
C99는 1999년 ISO/IEC 9899:1999로 출판된 C 프로그래밍 언어의 표준으로, 인라인 함수, 가변 길이 배열, `//` 주석 등 새로운 기능들을 추가하고 IEEE 부동소수점 자료 지원을 개선했으며 C90과 하위 호환성을 가지면서 C++와의 호환성을 고려했다. - C++ - 헤더 파일
헤더 파일은 프로그래밍 언어에서 코드 재사용성, 모듈화, 컴파일 시간 단축에 기여하며 함수 프로토타입, 변수 선언 등을 포함하고 `#include` 지시어로 소스 코드에 포함되어 사용되는 파일이다. - C++ - 소멸자 (컴퓨터 프로그래밍)
소멸자는 객체가 메모리에서 제거되기 직전에 호출되는 멤버 함수로, 객체 자원 해제 및 정리 작업을 수행하며, C++ 등 여러 언어에서 구현되고 메모리 누수 방지에 기여한다.
C++14 | |
---|---|
C++14 | |
상세 정보 | |
2. 새로운 언어 기능
다음은 C++14의 핵심 언어에 추가된 기능이다.
- 함수 반환 형식 추론 (Function return type deduction)
- 선언 시 대체 형식 추론 (Alternate type deduction on declaration)
- 완화된 constexpr 제약 (Relaxed constexpr restrictions)
- 변수 템플릿 (Variable templates)
- 애그리게이트 멤버 초기화 (Aggregate member initialization)
- 바이너리 리터럴 (Binary literals)
- 숫자 구분자 (Digit separators)
- 제네릭 람다 (Generic lambdas)
- 람다 캡처 표현식 (Lambda capture expressions)
- deprecated 속성 (The attribute, deprecated)
2. 1. 함수 반환 형식 추론
C++11에서는 람다 함수가 반환문에 주어진 표현식의 유형을 기반으로 반환 유형을 추론하도록 허용했다. C++14는 이러한 기능을 모든 함수로 확장했으며, 람다 함수에서도 `return expression;` 형식이 아닌 함수의 반환 유형 추론을 허용하도록 기능을 확장했다.[3]함수 반환 형식 추론을 사용하려면, 함수 선언 시 반환 유형을 `auto`로 지정하고 C++11의 후행 반환 유형 지정자는 사용하지 않아야 한다.
```cpp
auto DeduceReturnType(); // 반환 유형을 컴파일러가 추론해야 함
```
함수 본문 내에 여러 개의 반환문이 사용될 경우, 모든 반환문의 표현식은 동일한 유형으로 추론되어야 한다.[4]
반환 유형을 추론하는 함수는 전방 선언될 수 있지만, 함수의 정의가 완료되기 전까지는 호출하여 사용할 수 없다. 또한 함수의 정의는 해당 함수를 사용하는 번역 단위 내에서 접근 가능해야 한다.
재귀 함수에서도 반환 형식 추론을 사용할 수 있다. 단, 재귀 호출은 반드시 함수 정의 내에서 최소한 하나의 반환문이 나타난 이후에 이루어져야 한다.[4]
```cpp
auto Correct(int i)
{
if (i == 1)
return i; // 반환 유형은 int로 추론됨
return Correct(i - 1) + i; // 첫 번째 반환문 이후이므로 재귀 호출 가능
}
auto Wrong(int i)
{
if (i != 1)
return Wrong(i - 1) + i; // 오류: 첫 반환문 이전에 재귀 호출 불가
return i; // 반환 유형은 int로 추론됨
}
2. 2. 선언 시 대체 형식 추론
C++11에서는 두 가지 형식 추론 방법이 추가되었다. `auto`는 주어진 표현식을 기반으로 적절한 형식의 변수를 만드는 방법이고, `decltype`은 주어진 표현식의 형식을 알아내는 방법이다. 하지만 `auto`와 `decltype`은 형식을 추론하는 방식이 다르다. 특히 `auto`는 `std::decay`를 사용하는 것처럼 항상 참조가 아닌 형식을 추론하는 반면, `auto&&`는 항상 참조 형식을 추론한다. 반면 `decltype`은 표현식의 값 범주와 추론하는 표현식 자체의 특성에 따라 참조 형식 또는 비참조 형식을 추론할 수 있다.[5][3]예를 들어 다음과 같은 차이가 있다.
```cpp
int i;
int&& f();
auto x3a = i; // decltype(x3a)는 int
decltype(i) x3d = i; // decltype(x3d)는 int
auto x4a = (i); // decltype(x4a)는 int
decltype((i)) x4d = (i); // decltype(x4d)는 int& (주의: 괄호 안의 표현식은 lvalue이므로 참조 타입)
auto x5a = f(); // decltype(x5a)는 int (함수 반환값의 decay)
decltype(f()) x5d = f(); // decltype(x5d)는 int&& (함수 반환 타입 그대로)
```
C++14는 `decltype(auto)`라는 새로운 구문을 추가했다. 이 구문을 사용하면 `auto` 키워드를 사용한 변수 선언 시, 초기화 표현식에 `decltype`의 규칙을 적용하여 형식을 추론한다. 즉, `auto`처럼 비참조 형식만 추론하는 것이 아니라, `decltype`처럼 표현식의 특성에 따라 참조 형식을 포함한 정확한 형식을 추론하게 된다.
`decltype(auto)` 구문은 함수의 반환 형식 추론에 `auto` 대신 `decltype(auto)` 구문을 사용하여 반환 형식 추론과 함께 사용할 수도 있다.[4]
2. 3. 완화된 constexpr 제약
C++11은 컴파일 시간에 실행될 수 있는 함수, 즉 `constexpr
`로 선언된 함수의 개념을 도입했다. 이 함수의 반환 값은 정수 템플릿 인자처럼 상수 표현식이 필요한 연산에 사용될 수 있었다. 하지만 C++11의 `constexpr
` 함수는 반환되는 단일 표현식(그리고 `static_assert
` 같은 몇몇 다른 선언)만 포함할 수 있다는 제약이 있었다.C++14에서는 이러한 제약이 완화되었다. 이제 `
constexpr
`로 선언된 함수는 다음 내용을 포함할 수 있다:[3]- 다음을 제외한 모든 선언:
- `
static
` 또는 `thread_local
` 변수. - 초기화가 없는 변수 선언.
- 조건 분기문 `
if
` 및 `switch
`. - 범위 기반 `
for
`를 포함한 모든 반복문. - 상수 표현식 함수 내에서 해당 객체의 수명이 시작된 경우, 객체의 값을 변경하는 표현식. 이는 `
constexpr
`로 선언된 모든 `const
`가 아닌 비정적 멤버 함수 호출을 포함한다.
`
goto
` 문은 C++14의 완화된 `constexpr
` 함수 선언에서는 사용할 수 없다.또한, C++11에서는 `
constexpr
`로 선언된 모든 비정적 멤버 함수가 `this
` 포인터에 대해 암묵적으로 `const
`로 취급되었으나, C++14에서는 이 제약이 사라졌다. 따라서 비정적 멤버 함수도 `const
`가 아닐 수 있다.[6] 하지만 위에서 언급된 제약 조건에 따라, `const
`가 아닌 `constexpr
` 멤버 함수는 해당 객체의 수명이 상수 표현식 평가 중에 시작된 경우에만 클래스 멤버를 수정할 수 있다.2. 4. 변수 템플릿
이전 버전의 C++에서는 함수, 클래스 또는 타입 별칭만 템플릿으로 만들 수 있었다. C++14는 변수 템플릿의 생성을 허용한다. 제안서에서 제공되는 예시는 다양한 타입에 대해 파이 값을 얻기 위해 읽을 수 있는 변수 `pi`이다 (예: 정수형으로 읽을 경우 `3`; `float`, `double` 또는 `long double`로 읽을 경우 해당 타입의 정밀도로 가능한 가장 가까운 값 등).이러한 선언과 정의에는 특수화를 포함하여 템플릿의 일반적인 규칙이 적용된다.[11][7]
```cpp
template
constexpr T pi = T(3.141592653589793238462643383);
// 일반적인 특수화 규칙이 적용됩니다:
template<>
constexpr const char* pi
2. 5. 애그리게이트 멤버 초기화
C++11에서는 생성자가 멤버를 직접 초기화하지 않은 경우, 클래스 범위에서 멤버에 적용할 표현식인 기본 멤버 초기화 기능이 추가되었다. 그러나 이로 인해 집합체(aggregate)의 정의가 변경되어, 기본 멤버 초기화가 있는 클래스는 명시적으로 집합체에서 제외되었고, 결과적으로 집합체 초기화를 사용할 수 없게 되었다.C++14에서는 이러한 제한이 완화되어[3] 기본 멤버 초기화를 가진 클래스에 대해서도 집합체 초기화를 사용할 수 있게 되었다. 만약 중괄호 `{}`를 이용한 초기화 목록에서 특정 멤버에 대한 값을 제공하지 않으면, 해당 멤버는 클래스 정의 시 지정된 기본 멤버 초기화 값을 사용하게 된다.[8]
2. 6. 바이너리 리터럴
C++14에서는 숫자 리터럴을 이진수 형태로 직접 표현할 수 있게 되었다.[3] 이진수 리터럴을 나타내려면 숫자 앞에 접두사 `0b` 또는 `0B`를 붙인다. 예를 들어, 십진수 10을 이진수로 표현하려면 `0b1010`과 같이 작성할 수 있다.이러한 이진수 표기법은 C++14 이전에도 자바, C#, Swift, Go, Scala, Ruby, Python, OCaml 등 다른 여러 프로그래밍 언어에서도 이미 사용하고 있었으며, 일부 C 컴파일러에서는 2007년부터 비공식 확장 기능으로 지원하기도 했다.[9]
2. 7. 숫자 구분자
C++14에서는 작은 따옴표 문자(`'`)를 숫자 리터럴, 즉 정수 리터럴과 부동 소수점 리터럴에서 숫자 구분 기호로 자유롭게 사용할 수 있다.[10] 이를 통해 사람이 큰 숫자를 순간 인지를 통해 더 쉽게 파악할 수 있도록 돕는다.```cpp
auto integer_literal = 1'000'000;
auto floating_point_literal = 0.000'015'3;
auto binary_literal = 0b0100'1100'0110;
auto a_dozen_crores = 12'00'00'000; // 인도 등 일부 지역의 숫자 표기 방식에도 적용 가능
2. 8. 제네릭 람다
C++11에서는 람다 함수의 매개변수를 구체적인 자료형으로 선언해야 했다. C++14는 이러한 요구사항을 완화하여, 람다 함수 매개변수를 `auto` 형식 지정자로 선언할 수 있게 되었다.[11]auto lambda = [](auto x, auto y) { return x + y; };
`auto` 형식 추론과 관련하여, 제네릭 람다는 템플릿 인수 추론 규칙을 따른다. 위 코드는 다음과 동일하다:[12]
struct
{
template
auto operator()(T x, U y) const { return x + y; }
} lambda{};
제네릭 람다는 본질적으로 템플릿화된 펑터 람다이다.
2. 9. 람다 캡처 표현식
C++11의 람다 함수는 외부 변수를 값으로 복사하거나 참조하는 방식으로만 캡처할 수 있었다. 이 때문에 이동 전용 타입(move-only type)의 객체는 값으로 캡처할 수 없는 제약이 있었다.[13]C++14에서는 람다 캡처 시 임의의 표현식을 사용하여 멤버를 초기화하는 기능이 도입되었다. 이를 초기화 캡처(init-capture)라고도 부른다. 이 기능을 이용하면 객체를 값으로 이동(move)시켜 캡처하거나, 외부 범위에 없는 새로운 멤버 변수를 람다 내부에 선언하고 초기화하는 것이 가능해졌다.[11]
이는 아래와 같이 초기화 표현식을 사용하여 수행된다.
```cpp
auto lambda = [value = 1] {return value;};
```
위 코드에서 람다 함수 `lambda`는 1을 반환하는데, 이는 캡처 절에서 `value`가 1로 초기화되었기 때문이다. 이렇게 선언된 캡처 변수의 타입은 초기화 표현식으로부터 `auto` 키워드처럼 자동으로 추론된다.
초기화 캡처는 표준 라이브러리의 `std::move` 함수와 함께 사용하여 객체를 이동시켜 캡처하는 데 유용하게 쓰인다. 예를 들어, 스마트 포인터인 `std::unique_ptr`처럼 복사가 불가능하고 이동만 가능한 객체를 캡처할 수 있다.
```cpp
#include
#include
std::unique_ptr
auto lambda = [value = std::move(ptr)] {return *value;}; // ptr의 소유권을 람다 내부의 value로 이동
2. 10. [[deprecated]] 속성
`deprecated` 속성은 사용 중단된 엔티티(함수, 변수 등)를 표시하는 데 사용된다. 이 속성이 붙은 엔티티는 사용이 허용되지만 권장되지 않으며, 컴파일 중에 경고 메시지가 출력될 수 있음을 사용자에게 알린다. 선택적으로 문자열 리터럴을 `deprecated`의 인수로 사용하여 사용 중단의 이유를 설명하고 대체를 제안할 수 있다.deprecated int f();
deprecated("g()는 스레드 안전하지 않습니다. 대신 h()를 사용하십시오")
void g( int& x );
void h( int& x );
void test()
{
int a = f(); // 경고: 'f'는 사용 중단됨
g(a); // 경고: 'g'는 사용 중단됨: g()는 스레드 안전하지 않습니다. 대신 h()를 사용하십시오
}
3. 새로운 표준 라이브러리 기능
C++14 표준에서는 C++ 표준 라이브러리에 여러 유용한 기능들이 새롭게 추가되었다. 주요 추가 기능은 다음과 같다.
- 공유 뮤텍스 및 잠금(Shared mutexes and locking): 여러 스레드가 동시에 읽기 접근을 허용하면서 단일 스레드만 쓰기 접근을 허용하는 동기화 메커니즘이 도입되었다.
- 연관 컨테이너 내 이종 검색(Heterogeneous lookup in associative containers): `map`, `set` 등 연관 컨테이너에서 키 타입과 다른 타입의 값으로도 요소를 검색할 수 있게 되었다.
- 표준 사용자 정의 리터럴(Standard user-defined literals): 문자열(`"s"`), 시간(`"h"`, `"min"`, `"s"`, `"ms"` 등), 복소수(`"if"`, `"i"`, `"il"`) 등을 위한 표준 리터럴 접미사가 추가되어 코드 가독성과 편의성을 높였다.
- 타입을 통한 튜플 요소 접근(Tuple addressing via type): 기존의 인덱스 기반 접근 외에, `std::get
(tuple)` 구문을 사용하여 튜플 내 특정 타입의 요소에 직접 접근할 수 있게 되었다.
이 외에도 `std::make_unique`, `std::integer_sequence`, `std::exchange` 함수 템플릿, 추가적인 반복자 지원 함수(`cbegin`, `cend` 등), `std::quoted` 입출력 조작자 등 다양한 소규모 라이브러리 기능들이 추가되어 개발 편의성이 향상되었다.
3. 1. 공유 뮤텍스 및 잠금
C++14는 공유 시간 제한 뮤텍스 및 관련 공유 잠금 유형을 추가했다.[14][15]3. 2. 연관 컨테이너 내에서 이종 검색
C++ 표준 라이브러리는 네 가지 종류의 연관 컨테이너 클래스를 정의한다. 이 클래스들은 특정 타입의 값을 키(key)로 사용하여 연관된 값을 찾을 수 있게 해준다. 예를 들어, 맵(map) 컨테이너는 사용자가 키와 값을 지정하면, 키를 통해 값을 조회하여 반환한다. 그러나 이전 버전에서는 조회를 할 때 항상 컨테이너가 사용하는 특정 키 타입(맵의 키 타입 또는 집합 자체의 값 타입)과 동일한 타입의 값으로만 검색해야 했다.C++14에서는 이러한 제약을 완화하여, 비교 연산자가 주어진 검색 값의 타입과 실제 키 타입을 비교할 수 있다면 임의의 타입으로도 조회를 수행할 수 있게 되었다.[16] 이를 '이종 검색(heterogeneous lookup)'이라고 부른다. 이 기능을 사용하면 예를 들어, 키 타입이 `
std::string
`인 맵에서 `const char*
` 타입의 문자열 리터럴이나 `operator<
` 오버로딩이 정의된 다른 타입을 사용해 직접 값을 검색할 수 있다. 또한, 여러 멤버 변수를 가진 복합 객체(예: 사람 정보를 담는 `struct Person
`)를 저장하는 `std::set
`에서 특정 멤버(예: 이름)의 값만으로 객체를 찾아야 할 때, 검색을 위해 임시로 전체 `struct Person
` 객체를 만들 필요가 없어지는 등 편리함이 증가했다.하지만 기존 코드와의 호환성을 유지하기 위해, 이종 검색 기능은 연관 컨테이너에 사용된 비교자(comparator)가 이종 검색을 명시적으로 허용하는 경우에만 활성화된다. C++ 표준 라이브러리에서 기본으로 제공하는 비교 클래스인 `
std::less<>
`와 `std::greater<>
`는 C++14 표준에 맞춰 이종 검색을 지원하도록 기능이 추가되었다.[17]3. 3. 표준 사용자 정의 리터럴
C++11에서는 사용자 정의 리터럴 접미사 구문을 정의했지만, 표준 라이브러리에서는 이를 사용하지 않았다. C++14에서는 다음과 같은 표준 리터럴을 추가했다.[16]- "s": 다양한 `std::basic_string` 유형을 생성하기 위한 리터럴.
- "h", "min", "s", "ms", "us", "ns": 해당 `std::chrono::duration` 시간 간격을 생성하기 위한 리터럴.
- "if", "i", "il": 해당 `std::complex
`, `std::complex `, `std::complex ` 허수를 생성하기 위한 리터럴.
아래는 표준 사용자 정의 리터럴의 사용 예시이다.
auto str = "hello world"s; // auto는 std::string 타입으로 추론된다.
auto dur = 60s; // auto는 std::chrono::seconds 타입으로 추론된다.
auto z = 1i; // auto는 std::complex
문자열을 위한 "s" 리터럴과 초 단위를 위한 "s" 리터럴은 서로 충돌하지 않는다. 문자열 리터럴 "s"는 문자열 리터럴에만 적용되고, 초 단위 리터럴 "s"는 숫자에만 적용되기 때문이다.[18]
3. 4. 타입을 통한 튜플 어드레싱
C++11에서 도입된 `std::tuple`은 타입화된 값들의 집합을 컴파일 시간 상수 정수를 이용해 인덱싱할 수 있게 했다. C++14에서는 이 기능이 확장되어, 기존의 정수 인덱스 방식뿐만 아니라 타입을 통해서도 튜플의 특정 요소에 접근할 수 있게 되었다.[16] 예를 들어, 튜플 내에서 `int` 타입의 값을 직접 가져올 수 있다.하지만 이 방식에는 한 가지 제약 조건이 있다. 만약 튜플 안에 같은 타입의 요소가 두 개 이상 존재한다면, 어떤 요소를 가져와야 할지 모호해지기 때문에 컴파일 시간 오류가 발생한다.[19]
다음은 타입 기반 접근과 기존의 인덱스 기반 접근을 보여주는 예시 코드이다.
tuple
int i = get
int j = get<2>(t); // 이전과 동일: j == 7
string s = get
위 코드에서 `get
3. 5. 그 외의 라이브러리 기능
- 공유 뮤텍스 및 잠금(Shared mutexes and locking) 기능이 추가되었다.
- 연관 컨테이너(associative containers) 내에서 다른 타입의 키를 사용하여 검색하는 이종 검색(Heterogeneous lookup) 기능이 추가되었다.
- 표준 사용자 정의 리터럴(Standard user-defined literals)이 도입되었다. 예를 들어, `s`를 사용하여 `'std::string'`, `h`/`min`/`s`/`ms`/`us`/`ns`를 사용하여 `'std::chrono::duration'` 타입의 리터럴을 생성할 수 있다.
- 타입을 통해 튜플의 요소에 접근하는 기능이 추가되었다. `'std::get
(tuple)'` 구문을 사용하여 튜플 내 특정 타입 `T`의 첫 번째 요소에 접근할 수 있다. - `'std::make_unique'`: `'std::unique_ptr'` 객체를 생성할 때 `'std::make_shared'`와 유사하게 사용할 수 있게 되었다.[11]
- `'std::integral_constant'`: 상수 값을 반환하는 `operator()` 오버로드가 추가되었다.[16]
- `'std::integer_sequence'`: 관련 별칭 템플릿과 함께, 매개변수 팩의 요소 인덱스 등 컴파일 시간 정수 시퀀스를 표현하기 위해 추가되었다.[20]
- 전역 함수 `'std::begin'`/`'std::end'`에 더하여, 상수 반복자(const iterator)를 반환하는 `'std::cbegin'`/`'std::cend'`, 역방향 반복자(reverse iterator)를 반환하는 `'std::rbegin'`/`'std::rend'`, 상수 역방향 반복자를 반환하는 `'std::crbegin'`/`'std::crend'` 함수가 추가되었다.
- `'std::exchange'`: 함수 템플릿으로, 변수에 새로운 값을 할당하고 이전 값을 반환하는 기능을 제공한다.[21]
- `'std::equal'`, `'std::mismatch'`, `'std::is_permutation'`: 두 번째 범위에 대한 반복자 쌍을 받는 새로운 오버로드가 추가되어, 두 범위의 길이가 같은지 미리 확인할 필요가 없어졌다.[22]
- `'std::is_final'`: 타입 특성(type trait)으로, 클래스가 `final` 키워드로 선언되었는지 여부를 컴파일 시간에 알아낼 수 있다.
- `'std::quoted'`: 스트림 입출력 조작자로, 문자열에 포함된 공백이나 특수 문자를 포함하여 문자열을 쉽게 입출력할 수 있게 돕는다. 출력 시 문자열 양쪽에 따옴표(기본값: 큰따옴표)를 추가하고, 입력 시 따옴표를 제거하며, 문자열 내의 따옴표는 이스케이프 처리한다.[23]
4. 컴파일러 지원
Clang은 버전 3.4에서 'c++1y'라는 표준 명칭으로 C++14의 모든 기능을 구현하며 지원을 완료했고[24][32], 버전 6부터 C++14를 기본 C++ 표준으로 채택했다.[24] GCC는 버전 5에서 C++14 지원을 완료했으며[25] (버전 5.1에서 크기 조정 배열(N3664) 제외 실험적 구현[30][31]), 버전 6부터 C++14를 기본 C++ 표준으로 채택했다.[25] Microsoft Visual Studio 2017 (VC14.1) 버전은 크기 조정 배열(N3664)을 제외한 C++14의 추가 기능을 모두 지원하며[35], "거의 모든" C++14 기능을 구현했다고 발표했다.[26] Intel C++ Compiler는 버전 17에서 크기 조정 배열(N3664)을 제외한 모든 기능을 지원한다 (버전 15부터 일부 기능 구현 시작[36]).
주요 컴파일러별 C++14 지원 현황은 다음과 같다.
컴파일러 | C++14 지원 완료 버전 | 기본 표준 채택 버전 | 비고 |
---|---|---|---|
Clang | 3.4[32] | 6[24] | 3.4 버전에서 c++1y라는 이름으로 지원 완료[24] |
GCC | 5[25] | 6[25] | 5.1 버전에서 크기 조정 배열(N3664) 제외 거의 모든 기능 실험적 구현[30][31] |
Microsoft Visual C++ | VS 2017 (VC14.1)[35] | - | 크기 조정 배열(N3664) 제외 C++14 추가 기능 지원[35], VS 2017에서 "거의 모든" 기능 구현[26]. VS 2013(VC12) 및 VS 2015(VC14) 시점에서는 C++11 기능 구현 중 C++14 일부 기능 구현 시작[33][34] |
Intel C++ Compiler | 17 | - | 크기 조정 배열(N3664) 제외 모든 기능 지원. 버전 15에서 일부 기능 구현 시작[36] |
GCC와 Clang에서는 컴파일 시 -std=c++14
옵션을 추가하여 C++14 표준을 사용할 수 있다.
참조
[1]
Citation
We have C++14!
https://isocpp.org/b[...]
2014-08-18
[2]
웹사이트
ISO/IEC 14882:2014
https://www.iso.org/[...]
[3]
웹사이트
The View from the C++ Standard meeting April 2013 Part 1
https://www.ibm.com/[...]
2016-01-27
[4]
웹사이트
N3638 Return type deduction for normal functions (Revision 5)
http://open-std.org/[...]
2013-06-14
[5]
웹사이트
Page 10 of: C++ auto and decltype Explained
http://thbecker.net/[...]
[6]
웹사이트
N3652 Relaxing constraints on constexpr functions
http://open-std.org/[...]
2013-04-18
[7]
웹사이트
N3651 Variable Templates (Revision 1)
http://open-std.org/[...]
2013-04-19
[8]
웹사이트
N3653 Member initializers and aggregates
http://open-std.org/[...]
2013-04-17
[9]
웹사이트
23479 – Implement binary constants with a "0b" prefix
https://gcc.gnu.org/[...]
[10]
웹사이트
N3781 Single-Quotation-Mark as a Digit Separator
http://www.open-std.[...]
2013-09-25
[11]
웹사이트
Trip Report: ISO C++ Spring 2013 Meeting
http://isocpp.org/bl[...]
2013-06-14
[12]
웹사이트
N3649 Generic (Polymorphic) Lambda Expressions (Revision 3)
http://open-std.org/[...]
2013-04-19
[13]
웹사이트
Move capture in Lambda
https://stackoverflo[...]
[14]
웹사이트
The View from the C++ Standard meeting April 2013 Part 3
https://www.ibm.com/[...]
2013-04-30
[15]
웹사이트
N3659 Shared locking in C++ (Revision 2)
http://open-std.org/[...]
2013-04-19
[16]
웹사이트
The View from the C++ Standard meeting April 2013 Part 2
https://www.ibm.com/[...]
2013-06-14
[17]
웹사이트
N3657 Adding heterogeneous comparison lookup to associative containers (rev 4)
http://open-std.org/[...]
2013-03-19
[18]
웹사이트
N3642 User-defined Literals for Standard Library Types (part 1 - version 4)
http://open-std.org/[...]
2013-04-18
[19]
웹사이트
N3670 Wording for Addressing Tuples by Type: Revision 2
http://open-std.org/[...]
2013-04-19
[20]
웹사이트
N3658 Compile-time integer sequences
http://www.open-std.[...]
2016-01-05
[21]
웹사이트
N3668 exchange() utility function, revision 3
http://www.open-std.[...]
2016-01-05
[22]
웹사이트
N3671 Making non-modifying sequence operations more robust: Revision 2
http://www.open-std.[...]
2016-01-05
[23]
웹사이트
N3654 Quoted Strings Library Proposal (Revision 2)
http://www.open-std.[...]
2016-01-05
[24]
웹사이트
C++ Support in Clang
http://clang.llvm.or[...]
2016-05-28
[25]
웹사이트
C++ Standards Support in GCC
https://gcc.gnu.org/[...]
2016-05-28
[26]
웹사이트
C++ Standards Conformance from Microsoft
https://blogs.msdn.m[...]
2017-03-07
[27]
웹사이트
Committee Draft, Standard for Programming Language C++
http://open-std.org/[...]
ISO
2014-11-04
[28]
웹사이트
We have C++14!
https://isocpp.org/b[...]
2014-11-04
[29]
웹사이트
ISO/IEC 14882:2014 -- Information technology -- Programming languages -- C++
http://www.iso.org/i[...]
ISO
2015-02-08
[30]
웹사이트
C++1y/C++14 Support in GCC - GNU Project - Free Software Foundation (FSF)
https://gcc.gnu.org/[...]
Free Software Foundation, Inc.
2015-12-02
[31]
뉴스
GCC 5系初のリリースとなる「GCC 5.1」登場 | OSDN Magazine
https://mag.osdn.jp/[...]
[32]
웹사이트
Clang - C++1z, C++14, C++11 and C++98 Status
http://clang.llvm.or[...]
[33]
블로그
C++11/14/17 Features In VS 2015 Preview - Visual C++ Team Blog - Site Home - MSDN Blogs
http://blogs.msdn.co[...]
[34]
문서
Support For C++11-14-17 Features (Modern C++) | Microsoft Docs
https://docs.microso[...]
[35]
문서
Visual Studio 2017 15.0 リリース ノート | Microsoft Docs
https://docs.microso[...]
[36]
웹사이트
C++14 Features Supported by Intel® C++ Compiler | Intel® Developer Zone
https://software.int[...]
[37]
웹인용
ISO/IEC 14882:2014 -- Information technology -- Programming languages -- C++
http://www.iso.org/i[...]
ISO
2014-01-14
[38]
웹인용
Committee Draft, Standard for Programming Language C++
http://open-std.org/[...]
ISO
2013-05-15
[39]
웹인용
We have C++14!
https://isocpp.org/b[...]
2014-08-18
[40]
웹인용
ISO/IEC search
http://www.iso.org/i[...]
ISO
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com