첫눈에 간단한 구문 설탕 인 것 같습니다.
그러나 더 깊게 살펴보면 C ++ 사용자 옵션을 확장하여 고유 한 내장 유형과 똑같이 동작하는 사용자 정의 유형을 생성 하므로 구문 설탕 이상의 의미 가 있습니다.이 작은 "보너스"는 C ++에 대한 흥미로운 C ++ 11 추가입니다.
C ++로 정말로 필요합니까?
지난 몇 년 동안 작성한 코드에서 몇 가지 용도를 보았지만 C ++에서 사용하지 않았다고해서 다른 C ++ 개발자 에게는 흥미롭지 않다는 의미는 아닙니다. .
우리는 컴파일러 정의 리터럴 인 C ++ (및 C)에서 정수를 짧은 정수 또는 긴 정수로, 실수를 부동 또는 더블 (또는 긴 더블)로, 그리고 문자열을 보통 또는 넓은 문자로 입력했습니다. .
C ++에서는 오버 헤드 (인라인 등)없이 자체 유형 (예 : 클래스) 을 만들 수있었습니다 . 우리는 연산자를 유형에 추가하고 유사한 내장 유형처럼 작동하도록 할 수 있었으므로 C ++ 개발자는 언어 자체에 행렬과 복잡한 숫자를 추가했을 때와 마찬가지로 자연스럽게 사용할 수 있습니다. 심지어 캐스트 연산자를 추가 할 수도 있습니다 (보통 나쁜 생각이지만 때로는 올바른 솔루션입니다).
우리는 여전히 사용자 유형이 내장 유형으로 동작하도록하는 한 가지를 놓쳤다 : 사용자 정의 리터럴.
따라서 저는 언어가 자연스럽게 진화 한 것 같지만 가능한 한 완전해야한다고 생각합니다. " 유형을 만들고 내장 유형만큼 가능한 한 동작하려면 여기 도구가 있습니다. .. "
부울, 정수 등 모든 프리미티브를 구조체로 만들고 모든 구조체가 Object에서 파생되도록하는 것이 .NET의 결정과 매우 유사하다고 생각합니다. 이 결정만으로도 Java가 사양에 추가 할 boxing / unboxing 해킹의 양에 관계없이 .NET은 프리미티브로 작업 할 때 Java의 범위를 훨씬 뛰어 넘습니다.
C ++로 정말로 필요합니까?
이 질문은 당신 이 대답 하기위한 것입니다. Bjarne Stroustrup이 아닙니다. 허브 셔터가 아닙니다. C ++ 표준위원회의 멤버는 아닙니다. 이것이 C ++에서 선택하는 이유 이며 유용한 표기법을 내장 유형으로 제한하지 않습니다.
경우 당신이 그것을 필요, 그것은 환영의 추가이다. 경우 당신이 하지, 음 ... 그것을 사용하지 마십시오. 비용이 들지 않습니다.
기능이 선택적인 언어 인 C ++에 오신 것을 환영합니다.
부푼??? 당신의 단지를 보여줘!
부풀어 오른 것과 복잡 한 것 (pun 의도 된 것)에는 차이가 있습니다.
Niels 가 사용자 정의 리터럴을 C ++에 추가하는 새로운 기능은 무엇입니까? 복잡한 숫자를 쓸 수 있다는 것은 C와 C ++에 "최근"추가 된 두 가지 기능 중 하나입니다.
// C89:
MyComplex z1 = { 1, 2 } ;
// C99: You'll note I is a macro, which can lead
// to very interesting situations...
double complex z1 = 1 + 2*I;
// C++:
std::complex<double> z1(1, 2) ;
// C++11: You'll note that "i" won't ever bother
// you elsewhere
std::complex<double> z1 = 1 + 2_i ;
이제 C99 "이중 복소수"유형과 C ++ "std :: complex"유형은 연산자 오버로딩을 사용하여 곱셈, 덧셈, 뺄셈 등을 수행 할 수 있습니다.
그러나 C99에서는 내장 유형과 내장 연산자 오버로드 지원으로 다른 유형을 추가했습니다. 그리고 또 다른 내장 리터럴 기능을 추가했습니다.
C ++에서는 방금 언어의 기존 기능을 사용했으며 문자 기능이 자연스럽게 언어의 진화라는 것을 알았으므로 추가했습니다.
C에서 다른 유형에 대해 동일한 표기법 향상이 필요한 경우, 로비에서 양자 파 기능 (또는 3D 포인트 또는 작업 분야에서 사용하는 기본 유형)을 추가하기 위해 로비까지 불운합니다. 빌트인 타입으로서의 C 규격이 성공.
C ++ 11에서는 직접 할 수 있습니다.
Point p = 25_x + 13_y + 3_z ; // 3D point
부 풀었습니까? 아니오 , C와 C ++ 단지가 리터럴 복잡한 값을 표현하는 방법이 어떻게 필요한지 보여 주듯이 필요가 있습니다.
잘못 설계 되었습니까? 아니요 , 확장 성을 염두에두고 다른 모든 C ++ 기능으로 설계되었습니다.
표기법만을위한 것입니까? 아니요 , 코드에 유형 안전을 추가 할 수도 있습니다.
예를 들어 CSS 지향 코드를 상상해 봅시다.
css::Font::Size p0 = 12_pt ; // Ok
css::Font::Size p1 = 50_percent ; // Ok
css::Font::Size p2 = 15_px ; // Ok
css::Font::Size p3 = 10_em ; // Ok
css::Font::Size p4 = 15 ; // ERROR : Won't compile !
그러면 값 할당에 강력한 타이핑을 적용하는 것이 매우 쉽습니다.
위험합니까?
좋은 질문. 이러한 함수는 네임 스페이스가 될 수 있습니까? 그렇다면 잭팟!
어쨌든 도구를 잘못 사용하면 모든 것과 마찬가지로 스스로를 죽일 수 있습니다 . C는 강력하며 C 건을 잘못 사용하면 머리를 쏠 수 있습니다. C ++에는 C 건이 있지만 메스, 테이 저 및 툴킷에서 찾을 수있는 다른 도구도 있습니다. 메스를 오용하고 피를 흘릴 수 있습니다. 또는 매우 우아하고 강력한 코드를 작성할 수 있습니다.
따라서 모든 C ++ 기능과 마찬가지로 실제로 필요합니까? C ++에서 사용하기 전에 대답해야하는 질문입니다. 그렇지 않으면 비용이 들지 않습니다. 그러나 당신이 정말로 필요하다면 적어도 언어는 실망시키지 않을 것입니다.
날짜 예?
당신의 오류는, 당신이 연산자를 혼합하고 있다는 것입니다.
1974/01/06AD
^ ^ ^
/ 연산자이기 때문에 컴파일러는 해석해야하므로 피할 수 없습니다. 그리고 AFAIK, 그것은 좋은 것입니다.
문제에 대한 해결책을 찾기 위해 다른 방법으로 리터럴을 작성합니다. 예를 들면 다음과 같습니다.
"1974-01-06"_AD ; // ISO-like notation
"06/01/1974"_AD ; // french-date-like notation
"jan 06 1974"_AD ; // US-date-like notation
19740106_AD ; // integer-date-like notation
개인적으로 정수와 ISO 날짜를 선택하지만 필요에 따라 다릅니다. 이것은 사용자가 자신의 리터럴 이름을 정의하게하는 요점입니다.