operator_alternative — 대체 연산자 표현
operator_alternative — 대체 연산자 표현
C++(및 C) 소스 코드는 ISO 646:1983 불변 문자 집합을 포함하는 모든 비-ASCII 7비트 문자 집합으로 작성될 수 있어요. 하지만 여러 C++ 연산자와 구두점은 ISO 646 코드 집합 밖의 문자({ } [ ] # \ ^ | ~)를 요구해요. 이런 기호 중 일부 또는 전부가 존재하지 않는 문자 인코딩(예: 독일 DIN 66003)을 쓸 수 있도록, C++는 ISO 646 호환 문자로 구성된 다음 대안들을 정의해요.
다시 말해, 키보드나 문자 집합이 제한된 환경에서도 && 같은 연산자를 and라는 단어로 쓸 수 있게 해주는 기능이에요.
출처: cppreference
본문
여러 연산자와 다른 토큰에는 비-ISO646 문자를 쓰는 대체 철자(alternative spelling)가 있어요. 언어의 모든 측면에서, 각 대체 토큰은 철자를 제외하고 기본 토큰(primary token)과 정확히 동일하게 동작해요. 두 글자 대체 토큰은 때때로 "다이그래프(digraph)"라고 불려요. 네 글자 길이지만 %:%:도 다이그래프로 간주돼요.
대체 토큰 (Alternative tokens)
| 기본 | 대체 |
|---|---|
&& |
and |
&= |
and_eq |
& |
bitand |
| ` | ` |
~ |
compl |
! |
not |
!= |
not_eq |
| ` | |
| ` | =` |
^ |
xor |
^= |
xor_eq |
{ |
<% |
} |
%> |
[ |
<: |
] |
:> |
# |
%: |
## |
%:%: |
트라이그래프 (Trigraphs)
다음 세 문자 그룹(트라이그래프)은 주석과 문자열 리터럴이 인식되기 전에 파싱되고, 각 트라이그래프의 등장은 해당 기본 문자로 대체돼요.
| 기본 | 트라이그래프 |
|---|---|
{ |
??< |
} |
??> |
[ |
??( |
] |
??) |
# |
??= |
\ |
??/ |
^ |
??' |
| ` | ` |
~ |
??- |
트라이그래프는 이른 시점에 처리되기 때문에, // Will the next line be executed?????/ 같은 주석은 다음 줄을 실제로 주석 처리하게 되고, "Enter date ??/??/??" 같은 문자열 리터럴은 "Enter date \\??"로 파싱돼요.
노트 (Notes)
&와 ! 문자는 ISO-646 하에서 불변이지만, 더 제한적인 옛 문자 집합을 수용하기 위해 이 문자를 쓰는 토큰에도 대체 철자가 제공돼요.
동등 연산자 ==에는 eq 같은 대체 철자가 없어요. 이는 = 문자가 지원되는 모든 문자 집합에 존재했기 때문이에요.
C와의 호환성
같은 단어들이 C 언어에서는 iso646.h include 파일에서 매크로로 정의돼요. C++에서는 언어에 내장되어 있으므로 C++ 버전의 <iso646.h>와 <ciso646>는 아무것도 정의하지 않아요. 그러나 <% 같은 비단어 다이그래프는 핵심 언어의 일부라 헤더를 include하지 않고도 사용할 수 있어요.
예제 (Example)
%:include <iostream>
struct X
<%
compl X() <%%> // 소멸자
X() <%%>
X(const X bitand) = delete; // 복사 생성자
// X(X and) = delete; // 이동 생성자
bool operator not_eq(const X bitand other)
<%
return this not_eq bitand other;
%>
%>;
int main(int argc, char* argv<::>)
<%
// 참조 캡처를 쓰는 람다:
auto greet = <:bitand:>(const char* name)
<%
std::cout << "Hello " << name
<< " from " << argv<:0:> << '\n';
%>;
if (argc > 1 and argv<:1:> not_eq nullptr)
greet(argv<:1:>);
else
greet("Anon");
%>
출력:
Hello Anon from ./a.out
<% 대신 {, and 대신 &&, not_eq 대신 !=, bitand 대신 &를 쓴 예제예요. 이런 대체 토큰들이 모두 기본 토큰과 동일하게 동작하는 걸 볼 수 있어요.
키워드
and, and_eq, bitand, bitor, compl, not, not_eq, or, or_eq, xor, xor_eq